黑马程序员—— OC加强---对象的拷贝-程序员宅基地

技术标签: ios学习历程  

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

第一讲 NSFileManager介绍和用法

什么是NSFileManager ?
顾名思义,NSFileManager是用来管理文件系统的 ,
它可以用来进行常见的文件\文件夹操作(拷贝、剪切、创建等);
NSFileManager使用了单例模式singleton,
使用defaultManager方法可以获得那个单例对象;
[NSFileManagerdefaultManager]
2、NSFileManager基本(常见的判断)
- (BOOL)fileExistsAtPath:(NSString*)path;
path这个文件或文件夹(目录)是否存在

  • (BOOL)fileExistsAtPath:(NSString*)path isDirectory:(BOOL*)isDirectory;
    path这个文件或文件夹是否存在, isDirectory代表是否为文件夹

  • (BOOL)isReadableFileAtPath:(NSString *)path;
    path这个文件或文件夹是否可读

  • (BOOL)isWritableFileAtPath:(NSString *)path;
    path这个文件或文件夹是否可写

  • (BOOL)isDeletableFileAtPath:(NSString *)path;
    path这个文件或文件夹是否可删除
<span "font-size:14px;">#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //NSFileManager 用于判断

        NSString *filePath = @"/Users/zhaoxiaohu/Desktop/arr.plist";

         NSString *filePath2 = @"/";

        // 1) 判断文件是否存在
        //创建文件管理对象
        //调用defaultManager 创建一个文件管理的单例对象
        //单例对象:在程序运行期间,只有一个对象存在
        NSFileManager *fm = [NSFileManager defaultManager];
        // YES 存在   NO 不存在
        BOOL isYES = [fm fileExistsAtPath:filePath];
        NSLog(@"-->%d",isYES);

        if(isYES){
            BOOL isDir;

            // 2) 判断是否是一个目录
            [fm fileExistsAtPath:filePath isDirectory:&isDir];

            if (isDir) {
                NSLog(@"这是一个目录");
            }else{

                NSLog(@"这不是一个目录");
            }

        }

        // 3) 判断文件是否可读

        isYES = [fm isReadableFileAtPath:filePath];


        // 4) 是否可写
        isYES = [fm isWritableFileAtPath:filePath2];


        // 5) 是否可删除
        isYES = [fm isDeletableFileAtPath:filePath2];

                 NSLog(@"-->%d",isYES);
    }
    return 0;
}</span>

第二讲 文件下载的思路

1.发送请求给服务器,要求下载某个文件
2.服务器发出响应,返回文件数据
3.手机客户端利用NSData来存放服务器返回的文件数据
4.利用NSFileManager将NSData里面的文件数据写到新的文件中.(createFileAtPath)

第三讲 ios沙盒机制

1、iOS沙盒机制
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
1.1、每个应用程序都有自己的存储空间
1.2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
1.3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
2、打开模拟器沙盒目录
下面看看模拟器的沙盒文件夹在mac电脑上的什么位置。
文件都在个人用户名文件夹下的一个隐藏文件夹里,中文叫资源库,他的目录其实是Library。

2.1 方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
输完单击Enter键,退出终端,重新启动Finder就可以了
重启Finder:鼠标单击窗口左上角的苹果标志–>强制退出–>Finder–>
现在能看到资源库文件夹了。

打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。

2.2 方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/ 前往。
username这里写你的用户名。
3、目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。

我们创建一个IosSandbox的项目来展开沙盒和文件读写等操作的练习。
创建后找到模拟器上对应的目录,
这是目录全展开了。

第四讲 NSNumber,NSValue,NSDate的介绍和使用

NSValue的使用:
// 创建NSValue对象
NSValue *value = [NSValue valueWithSize:NSMakeSize(12, 34)];
// 创建可变数组对象
NSMutableArray *array = [NSMutableArray array];
// 把NSValue添加到数组中
[array addObject:value1];
// 从数组中取出值来
NSValue *v = [array lastObject];
// 把NSSize从NSValue中解出来
NSSize size = [v sizeValue];
// 打印信息
NSLog(@”x = %d, y = %d”, size.width, size.height);
// 存放自己写的结构体
typedef struct {
int year;
int month;
int day;
}Data;
Data data = {2013, 08, 3};
// 创建NSValue对象并存入自定义的结构体
NSValue *value = [NSValue value:&data withObjCType:@encode(Data)];
// 取出放入的结构体(取出的时候没有返回值,使用指针变量得到结果)
Data d;
// [value1 getValue:<#(void )#>]; void 代表任何指针
[value getValue:&d];

NSNumber的使用:
// NSNumber的创建和添加元素、可以存入int、double、float、BOOL、char等等类型
NSNumber *number = [NSNumber numberWithInt:432];
// 把值取出
int i = [num intValue];
// double d = [num doubleValue];
// float f = [num floatValue;
// 。。。。。。。

NSDate的使用:
// 创建NSDate对象
NSDate *date = [NSDate date];

// 在当前的时间增加3秒
// Interval就是秒,其实就是一个double类型
date = [NSDate dateWithTimeIntervalSinceNow:3];

// 从1970年。。。增加43秒
date = [NSDate dateWithTimeIntervalSince1970:43];


// 会随机返回一个比较遥远的未来时间
date = [NSDate distantFuture];
// 会随机的返回一个遥远的过去的时间
date = [NSDate distantPast];

// 返回从1970返回的毫秒数
NSTimeInterval interval = [date timeIntervalSince1970];

// 和另一个时间对比
NSDate *date1 = [NSDate date];
[date timeIntervalSinceDate:date1];

// 两个日期的比较
// 相同返回YES,否则返回NO
BOOL b1 = [date isEqualToDate:date1];
// 返回比较早的那个时间
NSDate *earlierDate = [date earlierDate:date1];
// 返回比较晚的那个时间
NSDate *laterDate = [date laterDate:date1];


// 日期格式化
// 格式化工具
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
// 格式化的样式
// 代表小时的h大写HH代表24小时制,小写hh代表12小时制
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 设置时区
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
// 格式化哪个日期
NSString *strDate = [formatter stringFromDate:date];
// 把字符串转换日期格式
NSDate *dateStr = [formatter dateFromString:@"2013-12-56 22:34:34"];

第五讲 集合对象的内存管理

当一个对象加入到集合中,那么该对象的引用计数会+1
当集合被销毁的时候,集合会向集合中的元素发送release消息

NSMutableArray *arr = [[NSMutableArray alloc] init];

    Person *p = [[Person alloc] init];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [arr addObject:p];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [p release];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [arr release];

当一个对象加入到集合中,那么该对象的引用计数会+1
当把一个对象从集合中移除时,会向移除的元素发送release消息

 NSMutableArray *arr = [[NSMutableArray alloc] init];
    Person *p = [[Person alloc] init];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [arr addObject:p];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [arr removeObject:p];
    NSLog(@"retainCount = %lu", [p retainCount]);
    [p release];
    [arr release];

1.官方内存管理原则

1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease
2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
2.集合的内存管理细节

1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1
3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
3.普遍规律

1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1
2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27239329/article/details/50208025

智能推荐

gradle依赖仓库地址配置_gradlerepository-程序员宅基地

文章浏览阅读9.3k次。通常情况下,gradle会使用系统默认的仓库(repo.maven.apache.org/maven2/)下载项目所需依赖包,下载速度非常的慢,因此有必要修改gradle默认的仓库地址。导致下载依赖包慢的原因在于,gradle系统默认配置的依赖仓库都在国外,因此解决的办法是使用网络距离近的仓库,或者是在不急于使用之前就将国外的仓库尽可能的全量缓存到局域网,使用的时候将会会非常快。目前阿里已经..._gradlerepository

条码软件即时打印扫描条码打印空白的处理方法_c# spire.pdf打印条形码显示不出来-程序员宅基地

文章浏览阅读503次。使用条形码制作软件制作条码是非常基本的功能,最近有用户在使用条码软件的打印时输入功能时,出现扫描条码后打印空白的情况,这种肯定是不正常的,下面我们就来看一下该如何处理:首先我们来看一下在中琅条码软件中打印时输入的具体操作方法:打开中琅条码软件,新建标签纸,然后点击左侧的“条形码”按钮,在画布上绘制条形码样式并双击,在图形属性-数据源中,点击“修改”按钮,数据对象类型选择“打印时输入”。选择数据对象类型后,在弹出的“请输入”框中,随便输入几个数据作为页面条形码数据,此处数据不..._c# spire.pdf打印条形码显示不出来

selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫-程序员宅基地

文章浏览阅读534次。#为了实时获取车辆信息,以及为了后面进行行使轨迹绘图,写了一个基于selelnium的爬虫爬取了车辆gps数据。#在这里发现selenium可以很好的实现网页解析和处理js处理#导包import timefrom selenium import webdriverfrom selenium.webdriver.support.wait import WebDriver..._车载gps大数据库爬虫

java聊天室(实训项目)_java模拟聊天室私聊-程序员宅基地

文章浏览阅读2.3k次,点赞5次,收藏41次。这里是我们实训的一个关于java聊天室的项目,有需要的同学可以看看,私聊功能未完善。话不多说,直接上代码。服务器:package ChatRoom;import java.awt.Color;import java.awt.Component;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JSplitPane;import javax.swing.JPanel;import j.._java模拟聊天室私聊

Jmeter分部式部署(windows)_jmeter分部署window-程序员宅基地

文章浏览阅读830次,点赞3次,收藏8次。Jmeter分布式部署_jmeter分部署window

python 学习笔记 metaclass详解_modelmetaclass-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏2次。python 元类 metaclass:metaclass 控制类的行为。当我们创建类的时候我们就可以通过这个类来创建对象实例,当然同样的,如果我们想要创建类,那么就必须根据这个metaclass来创建类,也就是说,我们需要先定义metaclass才能过创建类。1:Python中类本省就是对象,类之所以为类,就是因为类这个对象本身拥有创建对象的能力。于是我们可以对类进行1:将它赋值给一_modelmetaclass

随便推点

2021-08-31通过altair来绘图_from vega_datasets import data-程序员宅基地

文章浏览阅读227次。1,散点import altair as alt# 加载可离线访问的数据集from vega_datasets import datasource = data.cars()alt.Chart(source).mark_circle(size=60).encode( x='Horsepower', y='Miles_per_Gallon', color='Origin', tooltip=['Name', 'Origin', 'Horsepower', .._from vega_datasets import data

radeon计算机丢失api,radeon-程序员宅基地

文章浏览阅读159次。radeonDriver for ATI/AMD Radeon based video chips, everything from Radeon 7000 (R100) to Radeon HD 7000 (Southern Islands) series. Part of xf86-video-ati, ie. also known as the ”ati” driver. License: ..._amd 缺少api

ISP IPSEC LAB-程序员宅基地

文章浏览阅读90次。1-IPSEC理论http://down.51cto.com/data/21125822-IPSEC LAN To LAN ×××具体的我不介绍了,网上太多R1(config)#crypto isakmp policy 100R1(config-isakmp)#encryption 3desR1(config-isakmp)#hash shaR1(config-isakmp)..._ipsec lab

Chapter 9 : Miscellany-程序员宅基地

文章浏览阅读417次。1. class B {public: virtual void f() const;};class D: public B {public: virtual void f();};The idea is for D::f to redefine the virtual functionB::f, but there's a mistake: in

vmcore分析和实战-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏34次。经典案例收集:1.解析结构体成员变量:http://blog.chinaunix.net/uid-14528823-id-4432077.html2.解析链表:https://access.redhat.com/solutions/27865913.Crash工具实战-结构体解析(skb相关解析)1.基础知识 1)工具:crash、vmcore、kernel对应版本的ke..._vmcore分析

plt.hist()和numpy.histogram()的学习_plt .hist和np.histogram-程序员宅基地

文章浏览阅读6k次。matplotlib.pyplot.histmatplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log..._plt .hist和np.histogram

推荐文章

热门文章

相关标签