strong和copy的区别

stong修饰可变类型

@property(nonatomic, strong) NSMutableArray * arr;

self.arr = [NSMutableArray array];
NSArray * arr1 = @[@"22", @"33"];
self.arr = arr1;
//报错,self.arr指向了不可变数组arr1,不能调用addObject方法
[self.arr addObject:@"23"];

copy修饰可变类型

@property(nonatomic, copy) NSMutableArray * arr;

self.arr = [NSMutableArray array];
NSMutableArray * arr2 = [NSMutableArray arrayWithObjects:@"2", @"222", nil];
self.arr = arr2;
//报错,使用copy修饰arr,赋值的时候,会对arr2执行copy,即[arr2 copy],得到的是不可变数组,然后赋值给self.arr,因此此时不能调用addObject方法
[self.arr addObject:@"23"];

strong修饰不可变类型

@property(nonatomic, strong) NSArray * arr;

NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"23", nil];
//strong修饰arr,将一个可变数组赋值给arr,改变可变数组,arr的值也将改变,这是不可以的。
self.arr = arr1;
[arr1 addObject:@"xx"];
NSLog(@"%@", self.arr);  // [@"23", @"xx"];

copy修饰不可变类型

@property(nonatomic, copy) NSArray * arr;

NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"23", nil];
//arr是不可变的,赋值给了一个可变数组,当可变数组发生改变的时候,属性arr也发生了改变,这与初衷是违背的
//为了避免这种情况出现,需要用copy修饰该属性。这样在赋值的时候,会对传入的值进行一份深拷贝,arr指向的将是copy后的内存区域
self.arr = arr1;
[arr1 addObject:@"xx"];
NSLog(@"%@", self.arr);

总结如下:
如果声明的属性是不可变的,那么为了避免在赋值的时候不小心赋值了一个可变的,那么应该用copy修饰这个属性。
如果声明的属性时可变的,希望赋值后属性值会在后面根据赋值的对象变化而变化,那么应该用strong修饰这个属性。

你可能感兴趣的:(strong和copy的区别)