美文网首页
iOS全解11:特殊问题

iOS全解11:特殊问题

作者: lukyy | 来源:发表于2021-03-04 22:53 被阅读0次
    1、浅拷贝和深拷贝的区别?

    浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。
    深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,指针指向新的内存,当修改A 时,B 不变。(即:B = [A copy]; )

    2、NSString为什么经常用copy修饰,用strong会有什么问题?`

    copy修饰的会重新拷贝一份,是新的内存地址(可变的对象 被copy后,会变成不可变的),值不会跟随改变。

    strong是强引用,指针指向原来的地址,值会跟随对象值的变化而变化。

    @interface ViewController ()
    @property (nonatomic, strong) NSString  *str1;
    @property (nonatomic, copy)   NSString  *str2;
    @end
    
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        NSMutableString *mtStr = [NSMutableString stringWithFormat:@"hello"];
        self.str1 = mtStr;
        self.str2 = mtStr;
        [mtStr appendString:@"World"];
    
        NSLog(@"---mtStr= %p  \n---str1:%p\n---str2:%p", mtStr, self.str1,self.str2);
        NSLog(@"str1= %@ \n---%@", self.str1, self.str2);
    }
    
    打印结果:
    ---mtStr= 0x281e945a0
    ---str1=  0x281e945a0         // strong 修饰(指向原来的地址)
    ---str2=  0xa00006f6c6c65685  // copy 修饰(指向新的地址)
    str1= helloWorld  // strong 修饰(指向原来的地址)
    str2= hello       // copy 修饰(指向新的地址)
    

    注意:如果对象是可变的,不管使用copy还是mutableCopy,都会开辟新的内存空间(深拷贝)。 比如: 对NSMutableString进行copy或者mutableCopy

    结论:copy与mutableCopy 要看拷贝的对象是不可变的还是可变的。

    1、如果拷贝的对象是 <不可变的> 例如:NSString *strA, 那么
    B = [strA copy]:copy只是浅拷贝 ,不会开辟新的内存
    C = [strA mutableCopy] :mutableCopy是深拷贝, 会开辟新的内存。

    2、如果对象是 <可变的>,例如:NSMutableString *mutableStrA,那么copy和mutableCopy都会开辟新的内存,都是深拷贝。
    D = [mutableStrA copy]
    E = [mutableStrA mutableCopy]

    3、自定义对象的拷贝都是深拷贝。自定义对象必须实现 NSCoping 和NSMutableCoping 协议,并实现copyWithZone或者mutableCopyWithZone,才能拷贝。

    NSString *strA = @"aaa";
    id strB = [strA copy];
    id strC = [strA mutableCopy];
    NSLog(@"\n---strA= %p \n---strB= %p\n---strC= %p", strA, strB, strC);
    
    ---strA= 0x10aa9a1b0
    ---strB= 0x10aa9a1b0  //浅拷贝:只拷贝指针
    ---strC= 0x600002eab030 //深拷贝:拷贝对象和新指针
    
    NSMutableString *strA = [NSMutableString stringWithFormat:@"aaa"];;
    id strD = [strA copy];
    id strE = [strA mutableCopy];
    NSLog(@"\n---strA= %p \n---strD= %p\n---strE= %p", strA, strD, strE);
    ---strA= 0x600000185080
    ---strD= 0xdfc88a36c03c694e //深拷贝:拷贝对象和新指针
    ---strE= 0x600000185200 //深拷贝:拷贝对象和新指针
    
    3、pod install 和 pod update 的区别?

    当我们用 CocoaPods 新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件。

    • Podfile.lock :文件里存储着我们已经安装的依赖库(pods)的版本。
    • $ pod --version:检查pod版本
    • $ pod env: 查看已经安装的cocoapods版本。
    • $ pod outdated:查看Podfile文件中的依赖库的最新版本。
    • $ pod setup:安装本地库
    • $ pod search 'AFNetworking':搜索某库
    • $ pod install:一般是第一次运行Pod时使用,会为每一个它安装的pod库在Podfile.lock文件中写入其版本号。
      再次使用时:只会处理没有记录在Podfile.lock中的依赖库,会查找匹配Podfile中描述的版本。
      1、不指定版本的匹配最新
      2、指定版本的不更新
    • pod update:不考虑Podfile.lock中版本的情况,会查找匹配Podfile中描述的版本。
      1、不指定版本的匹配最新
      2、指定版本的不更新



    持续更新。。。



    相关文章

      网友评论

          本文标题:iOS全解11:特殊问题

          本文链接:https://www.haomeiwen.com/subject/uvhlqltx.html