为什么NSMutableArray必须用strong,而NSArray必须用copy?

1.NSMutableArray:

@property (nonatomic, copy) NSMutableArray *mArray;//等同于
- (void)setMArray:(NSMutableArray *)mArray {

_mArray = mArray.copy;

}

mArray属性就成了NSArrayNSMutableArray只能用strong修饰,不存在有copy修饰的情况,写了就成NSArray了。

如果是strong,直接是赋值_mArray = mArray;右边是什么,左边就是什么,并且是强引用新值。这样就和strong的作用一样了。

所以:用copy为关键字的话,调用setter方法后。是对赋值对象进行深拷贝。并且拷贝的对象是copy的(不可变的),而不是

mutableCopy的(可变的)。所以用copy修饰的mutableArray也被视为Array了,所以再用mutableArray的方法就会发生崩溃。

2.NSArray

strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着

源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。



@property (nonatomic, strong) NSArray *array;
NSMutableArray *mutableArray = [NSMutableArray array];  

 [mutableArray addObject:@"1"];  
 self.array = [NSArray array];  
 self.array = mutableArray;   
 NSLog(@"array---%@", self.array);  

 [mutableArray addObject:@"2"];  
 NSLog(@"array---%@", self.array);

打印结果显示,array的长度发生了变化,具有调用mutableArray方法的能力。

结论:当修饰可变类型的属性时,如NSMutableArrayNSMutableDictionaryNSMutableStringstrong当修饰不可变类型的属性时,如

NSArrayNSDictionaryNSString,用copy


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值