iOS copy strong修饰符区别

1.无论是修饰符不一样 还是新值是可变或是不可变都没影响 主要是旧值是可变的还是不可变的 不可变的地址内容都一样 可变的strong和copy是不一样的:copy: 地址不一样 内容一样 strong:地址一样 内容一样;
2.不可变新值: 无论用什么(strong or copy)修饰都是不可变的 不会因为旧值是可变的赋值给新值而受影响;
可变新值: 用copy修饰时无论旧值是可变或是不可变 新值都是不可变的修改新值元素会崩溃 用strong修饰时 旧值是不可变的同copy也会崩溃 只有旧值是可变时修改其元素都会改变不崩溃;
3.如果对一个 不可变对象 赋值,那么新对象用 copy 和 retain 并没有什么区别。
如果对一个 可变对象 赋值,新对象随着原对象变化而变化用 retain;否则用 copy。(实际开发中:通常都是用 retain 或者 strong)
4.不可变类型在使用 copy 和 retain 给变量赋值的时候没啥区别,都是浅拷贝。
可变类型在使用 copy 时进行深拷贝,retain 时进行浅拷贝。

@property (nonatomic, strong) NSArray *sAry;
@property (nonatomic, copy) NSArray *cAry;

  NSArray *array = @[@"1",@"2"];
  NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"11",@"22", nil];

    /******* 不可变copy类型 可变和不可变赋值区别: ***/

    self.cAry = array; //新对象不可变 旧对象不可变 地址 内容都一样 指向同一块内存
    self.cAry = mArray;//新对象不可变 旧对象可变 地址不一样 内容一样 指向不同内存

    /******* 不可变strong类型 可变和不可变赋值区别: ***/

    self.sAry = array;//新对象不可变 旧对象不可变 地址一样 内容一样 指向同一块内存
    self.sAry = mArray;//新对象不可变 旧对象可变 地址一样 内容一样 指向同一块内存 改变其中一个两个内容都改变
@property (nonatomic, copy) NSMutableArray *cmutableAry;
@property (nonatomic, strong) NSMutableArray *smutableAry;

    NSArray *array = @[@"1",@"2"];
    NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"11",@"22", nil];

    /******* 可变copy类型 可变和不可变赋值区别: ***/
 
     self.cmutableAry = array;//新对象可变 旧对象不可变 地址 内容都一样 指向同一块内存 新对象内容改变 会崩溃 copy出来的是不可变数组(在不重写set方法时)
     self.cmutableAry = mArray;//新对象可变 旧对象可变 地址不一样 内容一样 指向不同内存 新对象内容改变 会崩溃 旧内容改变不影响新对象内容
     [mArray removeLastObject];

    /******* 可变strong类型 可变和不可变赋值区别: ***/

         self.smutableAry = array;//新对象可变 旧对象不可变: 地址一样 内容一样 指向同一块内存 新对象内容改变 会崩溃 copy出来的是不可变数组(在不重写set方法时)
         self.smutableAry = mArray;//新对象可变 旧对象可变: 地址一样 内容一样 指向同一块内存 新对象内容改变 旧内容也改变
         [mArray removeLastObject];

你可能感兴趣的:(iOS copy strong修饰符区别)