OC加强--第五天学习总结
1.NSFileManager介绍
NSFileManager是用来管理文件系统的。它可以用来进行常见的文件/文件夹操作。
NSString*filePath=@”/users/xiaobai/desktop/strong.plist”;
1)判断文件是否存在
NSFileManager *fm=[NSFileManagerdefaultManager];//创建一个文件管理对象。
BOOL isYES=[fmfileExistsAtPath:filePath]; //判断文件是否存在
BOOL isDir;
[fm fileExistsAtPath:filePath isDirectory:&isDir];//判断是否是目录
2)判断文件是否可读
[fm isReadableFileAtPath;filePath];
3)判断文件是否可写
[fm isWritableFileAtPath;filePath];
5)判断文件是否可删除
[fm isDeletableFileAtPath;filePath];//返回的是BOOL型
2.NSFileManager用法深入(一)
NSFileManager *fm=[NSFileManagerdefaultManager];
1)如何获取文件的信息(属性)
NSDictionary *dic=[fmattributesOfItemAtPath:filePath error:nil];
2)获取指定目录下的文件及子目录
NSArray *arr=[fmsubpathsAtPath:dirPath];//使用递归的方式,获取当前目录及子目录下的所有文件及文件夹
Arr=[fm subpathsOfDirectoryAtPath:dirPatherror:nil];//不是使用递归的方式获取的,建议使用。
3)获取指定目录下的文件及目录信息(不在获取后代路径)
Arr= [fm contenesOfDirectortyAtPath;dirPatherror:nil];
3.NSFileManager 用法深入(二)
1)如何创建目录
NSString *createDirPath=@”/Users/xiaobai/desktop/aaa”;
[fm createDirectoryAtPath:createDirPathwithIntermediateDirectories:NO attributes:nil error:nil]; ---->withIntermediateDirectories:YES表示自动创建目录中缺少的目录
---->attributes:nil 表示属性的字典为空
2)如何创建文件
[fm createFileAtPath:@”路径” contents:NSData类型的数据 attributes:文件的属性的字典];
NSString *str=@”guoyuanyua”;
//如何创建NSData? 是一个处理二进制数据的类
NSData *data=[str dataUsingEncoding:NSUTF8StringEncoding];
[fm createFileAtPath:createDirPathcontents:data attributes:nil];//返回bool型
3)如何copy文件
NSString * targetPath=@”/Users/xiaobai/desktop/aaa/xx.plist”;
NSString *createDirPath=@”/Users/xiaobai/desktop/xx.plist”;
[fm copyItemAtPath:createDirPath toPath:targerPath error:nil];
4)如何移动文件
[fm moveItemAtPath:createDirPathtoPath:targetPath error:nil];
5)如何删除文件
[fmremoveIntemAtPath:targetPath error:nil];
4.ios沙盒(sandbox)机制及获取沙盒路径
1)沙盒的基本概念和作用
每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许 访问其他应用的应用沙盒。在ios8中已经开放访问(extension)
2)沙盒包含
应用程序包:包含所有的资源文件和可执行文件
Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。
Tmp:保存应用运行时所需的临时数据,使用完毕后在将相应的文件从该目录上删除。
Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录
Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会再应用退出删除。
Libarary/Preferences:保存应用的所有偏好设置。
3)获取目录
NSSearchPathForDirectoriesInDomains()返回一个绝对路径用来存放我们需要存储的文件
第一个参数:要获取的沙盒文件夹名称
第二个参数:
NSUerdomainMask=1//用户主目录中
NSLocaldomainMask=2//当前机器中
NSNetworkDomainMask=4//网络中可见的主机
NSSystemDomainMask=8//系统目录,不可修改
NSAllDomainsMask=0x0ffff//全部
第三个参数:YES/NO 是否获取全路径
1.获取分目录
NSString*sandBoxPath=NSHomeDirectory();
2.Document
NSArray *path=
NSSearchPathForDirectoriesInDomains(NSDovunentDiretory,NSUserDomainMask,YES);
3.在Document目录下创建新的文件夹test
NSArray *arr=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *str=[[arr lastObject]stringByAppendingPathComponent:@”test/a.txt”];
5.常见的结构体:6.NSNumber的介绍和作用
NSArray/NSDictionary中只能存放oc对象,不能存放基本数据 类型,如果非要存,需要先把基本数据类型包装成oc对象。
NSNumber可以把基本数据类型包装成对象,这样就可以间接将基本数据类型存放进 NSArray/NSDictionary中。
转换方法:
+(NSNumber *)numberWithInt:(int)value;
+(NSNumber *)numberWithFloat:(float)value
+(NSNumber *)numberWithdouble:(double)value
1)基本数据类型转换成oc类型
例1:int a=10;
NSNumber *intobj=[NSNumber numberWithInt:a ];
NSMutableArray *arr=[NSMutableArray arrayWithobjects:intobj,nil];
例2:@(变量名)-->把基本数据类型包装成NSNumber类型
@数值 --->把数值包装成NSNumber对象
2)Oc类型转换成基本数据类型
NSNumber *n1=array[0];
Int a1=[n1 intValue];
7.NSValue的介绍和使用
NSNumber是NSValue的子类,NSValue主要用来把指针,CGRect等包装成OC对象,以便存储。
NSValue类的目标就是允许将pointers,struct,object,id.enum数据类型的数据结构能够被添加到集合里。
例:
CGPoint p1=CRPointMake(34,4);
NSMutableArray *arr=[NSMutableArrayarray];
NSValue *pointval=[NSValuevaluewithpoint:p1];
[arr addobjec:pointval];
读取:
NSValue *r1val=[arr lastobject];
NSRect r2=[r1val rectvalue];
NSLog(@”%@”,[NSStringFromRect:r2]);
例:
typedef struct{
Int year;
Int month;
Int day;
}myData;
Void main(){
myData md={2015,12,3};
@encode(myData)作用,把myData类型生成一个常量字符串描述
NSValue *val=[NSValue valueWithBytes:&mdobjCType:@encode(myData)];
//定义一个数组,把val存到数组中
NSMutableArray*arr=[NSMutableArray array];
[arr addobject:val];
//从数组中取出来NSValue对象
//从对象中,取出结构体变量的值
//传入一个结构体变量的地址
myData tmd;
[valgetValue:&tmd];//getvalue获取结构值,保存到结构体变量tmd
NSLog(@”%d,%d,%d”,tmd,year,tmd.month,tmd.day);
8.NSDate的介绍和使用
NSDate可以用来表示时间,可以进行一些常见的日期/时间处理
一个NSDate对象就代表一个时间此时时间是0时区,换算成我们的时间要+8
[NSDate date];返回的就是当前时间
1)格式化日期:NSDateFormatter
设置日期的显示格式:
yyyy表示四位的年份
MM表示2位的月份
dd表示2位的天数
NSDate *d1=[NSDatedate];
NSDateFormatter*formatter=[NSDateFormatter new];
Formatter.dateformat=@”yyyy-MM-dd HH:mm-ss”;
NSString*datestr=[formatter stringfromdate:d1];
NSLog(@”%@”,datestr);
HH表示24小时制的小数 hh 12小时制的
mm表示2位的分钟数
ss表示2位的秒数
2)计算日期
计算明天的此刻时间
NSDateFormatter*formatter=[NSDateFormatter new];
formatter.dateformat=@”yyyy-MM-ddHH:mm-ss”;
NSTimeIntervalt=60*60*24;
NSDate *tom=[NSDatedateWithTimeIntervalSinceNow:t];
NSString*str=[formatter sringfromdate:tom];
3)日期时间对象
结合NSCalendar和NSDate能做更多的日期、时间处理
例:
NSCalendar *ca=[NSCalendarcurrentCalendar];
NSDate *d=[NSDatedate];
NSDateComponents*cms=
[cacomponents:NSCalendarUnitYear|NSCalendarUintMonth|NSCalendarUintDayfromDate:d];
NSLog(@”%ld-%ld-%ld”,cms.year,cms.month,cms.day;
9.集合内存管理
1)当把一个对象添加到集合中时,这个对象会做一次retain操作,技术器会+1
2)当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1;
3)当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
10.copy的介绍和使用
不可变的对象(NSString ,Array ,Dictionary)被copy复制后也是不可变的被mutablecopy之后是可变的
可变的对象(MutableaNSString,MutableArray,MutableDictionary)被复制mutablecopy后是可变的。被copy之后产生不可变的对象。
进行了copy以后,没有重新的分配内存空间, 这是浅拷贝。只是拷贝了地址,并没有真正的分配新的内存空间。源对象和副本对象是同一个对象,源对象应用计数+1.
MutableCopy分配一个新的空间,这是一个深拷贝,开辟一个新的空间,存储副本对象,副本对象引用计数+1,源对象引用计数不变。
11.@property内存管理策略
1.非ARC
1)copy:只用于NSString\block
2)retain:除NSString\block以外的oc对象
3)assign:基本数据类型,枚举,结构体(非oc对象),当2个对象相互引用,一端用retain,一端用assign
2.ARC
1)copy:只用于NSString\block
2)strong:除NSString\block以外的oc对象
3)week:当2个对象相互引用,一端用strong 一端用weak
4)assign:基本数据类型,枚举,结构体(非oc对象)
12.为自定义的类实现copy操作
1.调用copy其实就是调用copyWithZone方法,所以要实现copyWithZone方法。
2.copyWithZone方法返回值类型是id类型,需要返回一个对象的副本。
3.不管对象可变或不可变,只要实现CopyWithZone方法即可。
单例模式概念
单例模式的意图是类的对象成为系统中唯一的实例,提供一个访问点,供客户类共享资源。
单例设计模式的要点:
1.某个类只能有一个实例;
2.他必须自行创建这个对象
3.必须自行向整个系统提供这个实例。
4必须定义一个接口(类方法)。
5.为了保证实例的唯一性,我们必须将
-(id)copywithzone:(NSZone *)zone{ retrurn self; }
+(id)allocwithzone:(NSZone *)zone {
@synchronized(self){ //线程保护,只允许一个访问
If(instances==nil){
Instances=[super allocwithzone:zone];
Returninstances;
}
}
Return instances;
}
-(id)retain { return self; }
-(NSUinteger)retaincount{ returnNSUIntegerMax; }
-(oneway void)release
-(id)autorelease{ return self; }