對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 的區(qū)別
第一種情況(傳遞不可變數據類型)
定義兩個NSString字符串释涛,一個用關鍵strong ,一個用copy,定義不可變字符串str,將他賦值給其他兩個倦沧。
可以看出來這種情況下copy和strong都是拷貝的地址
這個時候再去對str重新賦值操作, 相當于對str重新分配了一個內存地址, 原來的strCopy和strStrong的內存上的內容并不會受影響, 所以值不變
第二種情況(傳遞可變數據)
可以看到, strStrong淺拷貝了地址, 而strCopy深拷貝了內容有了新的內存地址, 所以當str改變值的時候strStrong也發(fā)生了改變.
第三種情況(可變類型賦值為copy)
這種情況就會出現文章開始的時候的問題了.
結論
對于不想改變值的屬性NSString, NSArray, NSDictionary等使用copy關鍵字.