首页 > 代码库 > OC中NSFileManager类 和 copy一些用法
OC中NSFileManager类 和 copy一些用法
一:NSFileManager的使用
//1,判断文件或文件夹是否存放// NSFileManager *fileManager = [NSFileManager defaultManager];// NSString *path = @"/Users/ll/Desktop/ll";// BOOL b = [fileManager fileExistsAtPath:path];// NSLog(@"%d", b); // 2,判断文件或文件夹是否存放,可以指定文件或文件夹// BOOL b = [fileManager fileExistsAtPath:path isDirectory:NO];// NSLog(@"%d", b); // 3,判断文件或者文件夹是否可读写、可删除// BOOL b = [fileManager isWritableFileAtPath:path];// BOOL c = [fileManager isReadableFileAtPath:path];// BOOL d = [fileManager isDeletableFileAtPath:path];// NSLog(@"%d", d);// NSLog(@"%d--%d", b, c);
2>判断文件的访问
// 1,获得文件或者文件夹的属性// NSFileManager *fileManager = [NSFileManager defaultManager];// NSString *path = @"/Users/ll/Desktop/ll.txt";// NSDictionary *dic = [fileManager attributesOfItemAtPath:path error:nil];// NSLog(@"%@", dic);// // 获得单独属性值// NSLog(@"%@", dic[NSFileSize]); // 2 获得path的所有?子路径(后代路径),下面两个?方法功能?一样// NSArray *arr = [fileManager subpathsAtPath:path];// NSArray *arr = [fileManager subpathsOfDirectoryAtPath:path error:nil];// NSLog(@"%@", arr); // 3获得path的当前?子路径(path下的所有(直接?子内容),path必须是?一个??目录// NSArray *arr = [fileManager contentsOfDirectoryAtPath:path error:nil];// NSLog(@"%@", arr); // 4获得文件内容 // 注意通过fileManager获得文件中的内容为二进制数需要转换// NSData *data = http://www.mamicode.com/[fileManager contentsAtPath:path];>// NSLog(@"%@", data); // 5,将字符串转换成NSData// NSString *string = @"nihao, 中国";// NSData *data = http://www.mamicode.com/[string dataUsingEncoding:NSUTF8StringEncoding];>// [fileManager createFileAtPath:path contents:data attributes:nil];
3>NSFileManager的文件操作
* NSFileManager的文件操作 • -(BOOL)copyItemAtPath:(NSString*)srcPathtoPath:(NSString *)dstPath error:(NSError **)error; ? 拷? • -(BOOL)moveItemAtPath:(NSString*)srcPathtoPath:(NSString *)dstPath error:(NSError **)error; ? 移动(剪切) • -(BOOL)removeItemAtPath:(NSString*)patherror:(NSError **)error; ? 删除
- (id)copyWithZone:(NSZone *)zone;
@end
? mutableCopy : 需要遵守NSMutableCopying协议,实现 mutableCopyWithZone:?方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
1> [对象 copy]; // 调用copy方法,最终产生的就是一个不可变对象。
2> [对象 mutableCopy]; // 调用mutableCopy方法,最终产生的就是一个可变对象。
3> 只有当不可变对象调用copy方法(得到的也是一个不可变对象)的时候,两个变量会指向同一个对象。其他情况下都是创建了一个新的对象(对象地址是不一样的)。
当拷贝完毕以后,如果两个对象的地址是一样的叫做“浅复制”(浅拷贝)
当拷贝完毕后,确实创建了一个新对象,这种情况下的拷贝,叫做“深复制”(深拷贝)
4规范
当使用@property的时候,遇到字符串类型的时候,建议使用copy关键字来修饰。
**注意:在MRC下,一般OC对象都使用retain,在ARC下,一般OC对象都是用strong
在MRC下,一般NSString都使用copy,在ARC下,一般NSString都是用copy
@property使用copy关键字修饰,表示生成的内存管理代码,中使用的时copy关键字。
为什么对于字符串类型,编写@property的时候要使用copy关键字?
答:防止外部的字符串发生变化后,互相影响。
代码示例:
@interface LLPerson : NSObject@property (nonatomic, strong) NSString *name;@end@implementation LLPerson@endint main(int argc, const char * argv[]){ @autoreleasepool { LLPerson *person = [[LLPerson alloc] init]; NSMutableString *string = [NSMutableString string]; [string appendString:@"sxs"]; person.name = string; [string insertString:@"s" atIndex:0]; NSLog(@"%@", person.name); } return 0;}
@property用strong修饰的话打印结果会改变,如果换成copy结果就不好改变,这也是copy的目的
注意:当不可变类型 调用copy方法(得到一个不可变类型)的时候,因为两个都是不可变类型,所以谁都不可能去修改源对象,所以这时无需担心,其中一个对象修改了影响另外一个对象,所以Apple帮我们做了优化,copy完毕以后,并没有创建新对象。
OC中NSFileManager类 和 copy一些用法