美文网首页
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