按照我们的习惯,我们在property属性时一般只对NSString类型和block才加copy关键字,对此我也曾疑惑,网上很多解释是对于NSString是为了保证其不可变性,因为用strong只是使对象的引用计数器加一,如果我们用父类指针(NSString *)指向子类对象(NSMutablestring)的话,子类对象发生改变会造成NSString同样改变,因为两个指针实际是指向一个对象,所以我们在声明时一般对NSString加以copy关键字。但我很不信服啊,NSArray和NSDictionary同样有可变与不可变两种状态,但清一色都是strong,这又是为何呢?自己做了一个测试,随便定义一个Person类,声明一个NSArray类型的属性,先用strong修饰,
@interface Person : NSObject
@property (nonatomic,strong)NSArray *childs;
@end
-(void)test2{
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"111",@"222",@"333",nil];
Person *p = [[Person alloc]init];
p.childs = array;
NSLog(@"%@",p.childs);
[array removeObjectAtIndex:0];
NSLog(@"%@",p.childs);
NSLog(@"%@",array);
}
输出结果为
2015-08-13 17:38:48.821 arrayCopyTest[5281:1226643] (
111,
222,
333
)
2015-08-13 17:38:48.822 arrayCopyTest[5281:1226643] (
222,
333
)
2015-08-13 17:38:48.822 arrayCopyTest[5281:1226643] (
222,
333
)
即我们的不可变数组属性childs随着外部可变数组的改变而改变了。
当我们用copy修饰时,
@interface Person : NSObject
@property (nonatomic,copy)NSArray *childs;
@end
输出结果为
2015-08-13 17:42:55.434 arrayCopyTest[5319:1247965] (
111,
222,
333
)
2015-08-13 17:42:55.435 arrayCopyTest[5319:1247965] (
111,
222,
333
)
2015-08-13 17:42:55.435 arrayCopyTest[5319:1247965] (
222,
333
)
我们的不可变数组并未发生改变,这才是我们想要的效果。
总结下来我也没能彻底弄清为什么会有这种约定俗成的习惯,自己还会再继续探索,有了新的发现一定会再次记下来。不过我们在编码的时候也不该被这些习惯所束缚,就像是strong和copy的选择,也是应当视情况而定的。