黑马程序员————第五天

NSFileManager 
1.用于判断文件是否存在
NSString *filePath=@"文件路径";//可将文件拖拽然后自动生成文件路径
//创建文件管理对象调用defaultManager创建一个文件管理对象
单例对象:在程序运行期间,只有一个对象存在
NSFileManager *fm=[NSFileManager defaultManager];
BOOL isYES=[fm fileExistsAtPath:filePath];


2.判断是否是一个目录 
if(isYES){
BOOL isDir;
[fm fileExistsAtPath:filePath isDirectory:&isDir];


3.判断文件是否可读
isYES=[fm isReadableFileAtPath:filPath];






4.是否可写
isYES=[fm isWritableFileAtPath:filPath];


5.是否可删除
isYES=[fm isDeletableFileAtPath:filPath];


根目录的文件修改和删除需要权限






NSFileManager用来管理文件/文件夹的操作


NSFileManager使用了单例模式singleton




如何获取文件的信息(属性)
NSFileManager *fm=[NSFileManager defaultManager];
NSString *filePath=@"文件路径";
NSDictionary *dict=[fm attributesOfItemAtPath:filePath error:nil];  返回的是字典类型
获取指定目录下文件及子目录
NSArray *subPaths=[fm subpathsAtPath:filePath];// 使用递归的方式获取当前目录及子目录所有文件和目录。
不是使用递归的方式获取的
subPaths=[fm subpathsOfDictionaryAtPath:dirPath error:nil];






获取指定目录下的子目录(不再获取后代路径)




subPaths=[fm contentsOfDictionaryAtPath:dirPath error:nil];




创建目录
NSString *createDirPath=@"";
[fm createDitrctoryAtPath:@"路径" withIntermediateDirectories:YES/NO attributes:nil error:nil];
创建路径的时候,如果为YES创建写出的所有目录,如果为NO程序没有


attributes属性的字典


如何创建文件
[fm createFileAtPath:createDirPath contents:(NSData *)attributes:(NSDictionary *)];
创建NSData 是一个处理二进制数据的类
NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];


[fm createFileAtPath:createDirPath contents:data attributes:nil];






copyItemAtPath:(NSString *)toPath:(NSString *) error:(NSError *)




[fm copyItemAtPath:createDirPath toPath:targetPath error:nil];






如何移动文件
[fm moveItemAtPath:creatDirPath toPath :targetPath error:nil];


如何删除文件


[fm removeItemAtPath:targetPath error:nil];






NSFileManager文件下载的思路


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




iOS沙盒机制


概念
应用沙盒就是文件系统目录,与其他应用的文件系统隔离
iOS不允许访问其他应用的应用沙盒


扩展阅读
extension 是iOS8新开放的一种对几个固定系统区域的扩展机制,弥补iOS的沙盒机制对应用间通信的限制。


应用沙盒一般包括以下几个文件目录:应用程序包,Documents,Libaray(下面有Caches和Preferences目录),tmp


应用程序包:包含所有的资源文件和可执行文件。


Document:保存应用程序运行时生成的需要持久化的数据,iTunes会自动备份该目录。
tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除。iPhone重启时该目录的文件会丢失


Library:存储程序默认设置和其他状态信息。iTune会自动备份该目录


Library/Caches:存放缓存文件,吃目录下文件不会在应用退出删除。
Library/Preferences:保存应用的所有偏好设置,ios的Settings应用会在该目录中查找应用的设置信息,iTues会自动备份该目录。




沙盒路径的获取方法
获取沙盒根目录
NSString *sandBoxPath=NSHomeDirectory();
沙盒的路径
NSHomeDirectory();
Dcuments路径
NSSearchPahForDirectoriesInDomains返回一个绝对路径用来存放我们需要存储的文件,是一个函数。
第一个参数要获取的沙盒文件夹名称
第二个参数是否在当前的主目录或其他


NSUserDomainMask=1 用户主目录中
NSLocalDomainMask=2 当前机器中
NSNetworkDomainMask=4 网络中可见的主机
NSSytemDomainMask=8 系统目录,不可修改
NSAllDomainsMask=0x0ffff 全部


第三个参数是否获取全路径
NSArray *paths=NSSearchPahForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
tmp路径
NSString *tmpDir=NSTemporaryDirectory();
Library路径
NSSearchPahForDirectoriesInDomains(NSCachesDirectory






在沙盒中创建文件夹
NSArray *paths=NSSearchPahForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path=[[arrs lastObject] stringByAppendingPathComponent:@"test/a.txt"];




常见的结构体


NSPoint和CGPoint的使用


CSPoint和NSPoint是是同义的


struct CGPoint{


CGFloat x; double类型
CGFloat y;


};


OC中特有的赋值方式
CGPoint c4=CGPointMake(10,10);
NSpoint np2=NSMakePoint(5,5);


struct CGSize{
CGFloat width;
CGFloat height;
};


CGSize和NSSize
用来表示平面的面积(大小)
width宽
height高
CGSize c4=CGSizeMake(10,10);
NSSize np2=NSMakeSize(5,5);


CGRect 和NSRect
表示在平面上左上角是某个点的矩形区域


struct CGRect{
CGPoint origin; 表示矩形左上角的点
CGSize size; 表示矩形大小


};


CGRect r1;
r1.origin.x=0;
r1.origin.y=0;

CGRect r3=CGRectMake(10,10,10,10);
NSRect nr1=NSMakeRect(10,10,40,50);




NSNumber的使用


NSArray\NSDictionary中只能存放OC对象,不能存放int float double
NSNumber 可以将基本数据类型包装成对象,这样就可以间接将基本数据类型存进Array /NSDictionary中


NSNumber的创建


+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithDouble:(double)value;
+(NSNumber *)numberWithBool:(BOOL)value;




NSNumber *n1=array[0];
int a1=[n1 intValue];


NSNumber 简写的形式


@(变量名)将变量转化为NSNumber对象


@18 @4 @数值 也是转换为NSNumber对象




NSValue的介绍和使用


NSNumber 是NSValue的子类 
NSValue主要用来把指针和结构体等包装成OC对象,存储。


结构体向NSValue的转换


+(NSValue *) valueWithPoint:(NSPoint)point;


+(NSValue *) valueWithSize:(NSSize)size;


+(NSValue *) valueWithRect:(NSRect)rect;




NSValue 向结构体转换


-(NSPoint)pointValue;
-(NSSzie)pointValue;
-(NSRect)pointValue;




MyDate md={2015,5,7};
NSValue *val=[NSValue valueWithBytes:&md objCType:@encode(MyDate)];
@encode(MyDate )作用,把Mydate类型生成一个常量字符串藐视。可以返回该类型的C字符串(char*)的表示


从数组取出NSValue对象
从对象中取出结构体变量的值
传入一个结构体变量的地址
MyDate tmd;
[val getValue:&tmd]; //获取结构值,保存到tmd中






NSDate的介绍和使用


[NSDate date]返回的当前时间


NSDate *d1=[NSDate date];
设置时区
NSTimeZone *zone=[NSTimeZone systemTimeZone];


设置时间间隔


NSInteger interval =[zone secondsFromGMTForDate:d];


重新生成时间


NSDate *localeDate=[d dateByAddingTimeInterval:interval];


格式化日期


NSDate *d1=[NSDate date];


NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
formatter.dateFormat=@"yyyy-MM-dd HH:mm:ss"; //小写h 表示是12小时大写是24
NSString *dateStr=[formatter stringFromDate:d1];




明天的此刻
NSTimeInterval secondsPerDay =24*60*60;
NSDate *tomorrow=[NSDate dateWithTimeIntervalSineNow:secondsPerDay];




昨天的现在




NSTimeInterval secondsPerDay1 =24*60*60;


NSDate *now=[NSDate date];
NSDate *yesterday=[now addTimeInterval:-secondsPerDay1];




日期时间对象
结合NSCalendar和NSDate能做更多的时间处理


获得NSCalendar对象


NSCalendar * calendar=[NSCalendar currentCalendar];


获得年月日
-(NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;


NSDate *d=[NSDate date];
NSCalendar * ca=[NSCalendar currentCalendar];
NSDateComponents *cms=[ca components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:d];


集合对象的内存管理


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

数组先挂   数组向其中的对象也发送release
添加删除对象 相应的引用计数加1减1




copy的概念


作用利用源对象建立一个副本对象
特点
修改源文件的内容不会修改源文件


修改源对象的属性和行为,不会影响副本对象




如何使用copy功能
一个对象可以调用copy或mutableCopy方法来创建一个副本对象
copy创建的是不可变副本 例如NSSstring NSArray NSDictionary


使用copy功能的前提
copy 需要遵守NSCopying协议,实现copyWithZone:方法


@protocol NSCopying
-(id)copyWithZone:(NSZone *)zone;
@end


mutableCopy: 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
@protocol SMutableCopying
-(id)mutablecopyWithZone:(NSZone *)zone;
@end
不可变对象调用 copy 产生不可变
可变对象调用   mutableCopy 产生可变


可变对象 copy 不可变
不可变对象调用 mutableCopy 产生可变


Copy 是浅复制 只是复制地址 没有产生新的对象
mutableCopy 是深复制 会在内存中重新分配一块内存空间




Copy 浅复制  源对象的引用计数 +1


mutableCopy  深复制 源对象的引用计数不变




@property copy的作用






-(void)setName:(NSString *)name
{


if(_name!=name){


[_name release];
-name=[name copy];
}
}


@property策略选择
非ARC
1.copy只用于NSString\block
2.retain 除NSString\block以外的OC对象
3.assign 非oc对象,当两个对象相互引用,一端用retain,一端用assign




2ARC
1.copy只用于NSString\block
2.strong:除NSString\block以外的OC对象
3.weak当两个对象相互引用,一端用strong,一端用weak
4.assign 非oc对象




为自定义的类实现copy操作


1.让Person类遵守NSCopying协议
2.实现copyWithZone方法在该方法中返回一个对象的副本即可
3.在copyWithZone方法中创建一个新的对象并设置该对象的数据与现有对象一致,并返回该对象。




细节:
1.调用copy其实就是调用copyWithZone方法,所以要实现
2.copyWithZone方法的返回值是id类型 需要返回一个对象的副本
3.关于copyWithZone的参数zone问题:
zone:表示空间 分配对象是需要内存空间的,如果指定了zone就可以指定新建
对象对应的内存空间,但是zone是一个非常古老的技术,为了避免在堆中出现内存碎片而使用的。


查看NSObject协议中的allocWithZone:方法介绍
4.如果对象没有可变/不可变的版本区别,只要实现copyWithZone方法即可
5.copyWithZone:方法的具体实现
-(id)copyWithZone:(NSZone *)zone{
Dog *d =[[Dog alloc] init];
d.speed=self.speed;
d.tuiNum=self.tuiNum;
return d;


}
自定义的对象拷贝都是深拷贝




单例模式概念 singleton


单例模式 是类的对象程序运行期间唯一的实例,提供一个访问点供客户类共享资源。


 


什么情况下使用单例
1.类只有一个实例,而且必须从一个为人熟知的访问点对其进行访问。
2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。


3.单例设计模式的要点
1.某个类只能有一个实例
2.他必须自行创建这个对象
3.必须自行向整个系统提供这个实例
4.为了保证实例的唯一性,我们必须将


多个界面传值方法
单例 
代理
static SingletonTools *instances=nil;


@implementation SingletonTools
单例的接入点方法
+(instancetype)shareInstances{
目的:保证对象必须唯一
if(instances==nil){


 创建一个对象
instances=[SingletonTools alloc] init];
return instances;
}
return instances;
}


重写方法


-(id)copyWithZone:(NSZone *)zone{
return self;
}
+(id)allocWithZone:(NSZone *)zone{
@synchronized(self){ //同步 同一时间只能一个访问线程保护
if(instances==nil){
instances=[super allocWithZone:zone];
return instances;
}}
return instances;
}
-(id)retain{
return self;
}
-(NSUInteger)retainCount{
return NSUIntegerMax;
}
-(oneway·void)release{


}







































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值