NSMutableDictionary是不可变的

时间:2016-03-15 08:54:38

标签: ios immutability nsmutabledictionary

在myClass.h中,我有

@property (copy, atomic) NSMutableDictionary *thisParticularWordList;

在myClass.m中,我按如下方式填充thisParticularWordList:

theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary];

在xcode的变量视图中,我看到,该实例的属性确实已填充。

在我的代码中,我尝试这样做:

[self.thisParticularWordList removeObjectForKey:self.theKey];

但不知何故,self.thisParticularWordList变成了一个不可变的NSDictionary。

我做错了什么?

2 个答案:

答案 0 :(得分:5)

这是因为您的财产的copy属性。看看this answer

解决方案是创建属性strong,然后在分配属性时,您将执行self.yourProperty = [yourDictionary mutableCopy];

甚至[NSMutableDictionary dictionaryWithDictionary: someDictionary];,因为它也会创建一个新词典。

演示修复的完整代码示例:

MyClass.h

@property (strong, atomic) NSMutableDictionary *thisParticularWordList;

MyClass.m

theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary];

然后这将在分配后起作用:

[self.thisParticularWordList removeObjectForKey:self.theKey];

答案 1 :(得分:0)

你需要担心这个特定的界限:

sed '1~2{s/\S\+/-&/g;s/--//g}' file

因为该属性的 setter 会复制您的可变集合并使其成为不可变之一;这就是为什么你以后会崩溃的原因。

您可能需要考虑仅保留强引用而不是复制它,例如:

@property (copy, atomic) NSMutableDictionary * thisParticularWordList;