zoukankan      html  css  js  c++  java
  • OC中NSFileManager类 和 copy一些用法

    一:NSFileManager的使用

    1, 概念:用来管理文件系统,它可以用来进行常见的文件文件夹的操作(拷贝、剪切、创建等)
     
         NSFileManager 使用了单例模式singleton
        使用defaultManager方法可以获取那个单例对象
     
    2,
     1>常见判断
     
            //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 = [fileManager contentsAtPath:path];
    //        NSLog(@"%@", data);
            
            // 5,将字符串转换成NSData
    //        NSString *string = @"nihao, 中国";
    //        NSData *data = [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;
             ➢ 删除
    二:copy
    1,概念:copy意思就是拷贝,产生一个副本的过程
         目的:多个地方同时使用同一个对象时,为了在某个地方修改了该对象不影响其他使用者,可以对该对象拷贝一个副本,
         特点:就是修改源文件内容,不会影响副本文件;修改副本文件也不会影响源文件
        
     2,OC中可以调用copy 或者mutable copy方法来创建一个副本
          使用copy或者mutable copy的前提:
          copy : 需要遵守NSCopying协议,实现copyWithZone:⽅方法 @protocol NSCopying

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

    ➢ mutableCopy : 需要遵守NSMutableCopying协议,实现 mutableCopyWithZone:⽅方法

    @protocol NSMutableCopying
    - (id)mutableCopyWithZone:(NSZone *)zone;

    @end
        
    3规则

    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
    
    @end
    
    int 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完毕以后,并没有创建新对象。

  • 相关阅读:
    「初级篇」跟我一起学docker(二)--核心概念和安装
    程序员有哪些借口可以让自己写出低质量的代码?
    「初级篇」跟我一起学docker(一)--认识
    后端程序猿怎么提高技术?提高编码质量?
    河南这么大的省,也所谓的准一线,为什么IT行业就是发展不起来呢?
    JAVA使用Gson解析json数据,实例
    JAVA equals 和 “==”的异同
    JAVA WEB 对返回数据进行按中文名称首字母A~Z升序排序
    JAVA验证数字的正则表达式,来一发
    【转】Java.util.ArrayList.set()方法实例
  • 原文地址:https://www.cnblogs.com/-boy/p/4104422.html
Copyright © 2011-2022 走看看