作为一个程序猿,是不是还经常困惑,此处讲解几个基础但是非常实用的列子。那就是属性Strong、Copy的修饰之旅。你是不是还经常迷惑,莫名其妙的代码就报了bug,莫名其妙数据就被改了,此处从属性修饰讲解一下为啥,有时候代码会被更改。
先说结论:
Strong:修饰可变数组
Copy:修饰不可变数组
区别:
@property (nonatomic, strong) NSArray *array0;
@property (nonatomic, copy) NSArray *array1;
@property (nonatomic, strong) NSMutableArray *array2;
@property (nonatomic, copy) NSMutableArray *array3;
- 首先验证一下 @property (nonatomic, strong) NSArray *array0;
@property (nonatomic, strong) NSArray *array0;
NSMutableArray *mutArray = [NSMutableArray arrayWithObjects:@"3",@"4",@"5", nil];
self.array0 = mutArray;
NSLog(@"%p",self.array0);
NSLog(@"%p",mutArray);
[mutArray addObject:@"6"];
NSLog(@"%@",self.array0);
NSLog(@"%@",mutArray);
此处修饰的数组,如果self.array0 指向的是mutArray的指针,所以当mutArray进行添加对象后,self.array0打印的将是添加后的可变数组内容。
所以@property (nonatomic, strong) NSArray *array0;
具体验证可以通过打印前后数组前后的指针查看,此处就不讲解了。
- 验证 @property (nonatomic, copy) NSArray *array1;
@property (nonatomic, copy) NSArray *array1;
NSMutableArray *mutArray = [NSMutableArray arrayWithObjects:@"3",@"4",@"5", nil];
self.array1 = mutArray;
NSLog(@"%p",self.array1);
NSLog(@"%p",mutArray);
[mutArray addObject:@"6"];
NSLog(@"%@",self.array1);
NSLog(@"%@",mutArray);
此处修饰的数组,如果self.array1 指向新的指针,同mutArray指针是不同的。最后打印结果不同。因为self.array1新开辟的空间。只是mutArray指针指向的地址里面添加了@"6".
所以@property (nonatomic, copy) NSArray *array1;
✅
-
验证 @property (nonatomic, strong) NSMutableArray *array2;
此处数组是可变的,使用strong修饰这个正确。
@property (nonatomic, strong) NSMutableArray *array2;
✅ -
验证 @property (nonatomic, copy) NSMutableArray *array3;
此处 copy修饰了可变数组修饰了后,再对self.array3进行数组操作会导致crash, 原因是copy修饰可变数组后,会变成不可变数组。
@property (nonatomic, copy) NSMutableArray *array3;
网友评论