关于NSArray的copy

按照我们的习惯,我们在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的选择,也是应当视情况而定的。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值