copy 和 retain 到底有啥区别

番外篇

写在前面
  • 本文主要因上篇文章 copy修饰NSArray strong修饰NSMutableArray 有感而写。
  • 也为解决上篇文章存在的遗留问题

  • 首先还是继续申明两个变量
@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 到底有啥区别)