iOS copy关键字

2018-12-25  本文已影响0人  斯特莫

对NSMutableDictionary设置copy属性会导致mutable失效

@property (nonatomic,copy) NSMutableDictionary* dic;
//调用
[dic setObject:@"object" forKey:@"key"];

[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance

原因:

不管是集合类对象,还是非集合类对象,接收到copy和mutableCopy消息时,都遵循以下准则:

copy返回imutable对象;所以,如果对copy返回值使用mutable对象接口就会crash;
mutableCopy返回mutable对象;

参考资料

2019.01.10更新

strong 和 copy 的区别

第一种情况(传递不可变数据类型)

定义两个NSString字符串,一个用关键strong ,一个用copy,定义不可变字符串str,将他赋值给其他两个。


传递不可变数据类型
打印结果

可以看出来这种情况下copy和strong都是拷贝的地址
这个时候再去对str重新赋值操作, 相当于对str重新分配了一个内存地址, 原来的strCopy和strStrong的内存上的内容并不会受影响, 所以值不变


赋值后 打印结果
第二种情况(传递可变数据)
传递可变数据
打印结果

可以看到, strStrong浅拷贝了地址, 而strCopy深拷贝了内容有了新的内存地址, 所以当str改变值的时候strStrong也发生了改变.

第三种情况(可变类型赋值为copy)

这种情况就会出现文章开始的时候的问题了.

结论

对于不想改变值的属性NSString, NSArray, NSDictionary等使用copy关键字.

上一篇 下一篇

猜你喜欢

热点阅读