美文网首页
copy 和 retain 到底有啥区别

copy 和 retain 到底有啥区别

作者: 笨笨编程 | 来源:发表于2017-09-22 11:16 被阅读76次

    番外篇

    写在前面

    • 首先还是继续申明两个变量
    @property (copy, nonatomic) NSString *cStr;
    @property (retain, nonatomic) NSString *rStr;
    
    • 在控制器打印结果
    // copy 和 retain 的区别
    - (void)testCopyAndRetain {
        NSString *str = @"笨笨编程";
        self.cStr = str;
        self.rStr = str;
        
        NSLog(@"\n str = %p,\n cStr = %p,\n rStr = %p", str, self.cStr, self.rStr);
        /* 输出结果:
         str = 0x106c78070,
         cStr = 0x106c78070,
         rStr = 0x106c78070
         */
         
        NSMutableString *mStr = [@"可变的笨笨编程" mutableCopy];
        self.cStr = mStr;
        self.rStr = mStr;
        
        NSLog(@"\n mStr = %p,\n cStr = %p,\n rStr = %p", mStr, self.cStr, self.rStr);
        /* 输出结果:
         mStr = 0x600000254850,
         cStr = 0x60000025dca0,
         rStr = 0x600000254850
         */
    }
    

    结果

    • 不可变类型在使用 copyretain 给变量赋值的时候没啥区别,都是浅拷贝。
    • 可变类型在使用 copy 时进行深拷贝,retain 时进行浅拷贝。

    结论

    • copy 属性是创建一个新的对象,对原对象并没有影响。只是新对象引用计数 +1. 换句话说,copy 减少了对上下文的依赖。
    • retain 属性进行浅拷贝,两个对象指向同一块内存地址。为防止野指针,对象引用计数 +1。两个对象会一起发生变化。

    使用中注意

    • 如果对一个 不可变对象 赋值,那么新对象用 copyretain 并没有什么区别。
    • 如果对一个 可变对象 赋值,新对象随着原对象变化而变化用 retain;否则用 copy。(实际开发中:通常都是用 retain 或者 strong

    是不是有点觉得文中所有的 retainstrong 的用法完全相似,那么 retainstrong 又有什么区别呢?

    相关文章

      网友评论

          本文标题:copy 和 retain 到底有啥区别

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