NSMutableDictionary 是不可变的
NSMutableDictionary is immutable
在myClass.h中,我有
@property (copy, atomic) NSMutableDictionary *thisParticularWordList;
在 myClass.m 中,我按如下方式填充 thisParticularWordList:
theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary];
我在 xcode 的变量视图中看到,确实填充了此实例的 属性。
在我的代码的其他地方,我尝试这样做:
[self.thisParticularWordList removeObjectForKey:self.theKey];
但不知何故,self.thisParticularWordList 变成了一个不可改变的 NSDictionary。
我做错了什么?
这是因为您的 属性 的 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];
你需要担心这一行:
@property (copy, atomic) NSMutableDictionary * thisParticularWordList;
因为 属性 的 setter 复制了您的可变集合并使其成为 不可变 之一;这就是为什么您稍后会崩溃的原因。
您可能需要考虑只保留强引用而不是复制它,例如:
@property (strong, atomic) NSMutableDictionary * thisParticularWordList;
在myClass.h中,我有
@property (copy, atomic) NSMutableDictionary *thisParticularWordList;
在 myClass.m 中,我按如下方式填充 thisParticularWordList:
theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary];
我在 xcode 的变量视图中看到,确实填充了此实例的 属性。
在我的代码的其他地方,我尝试这样做:
[self.thisParticularWordList removeObjectForKey:self.theKey];
但不知何故,self.thisParticularWordList 变成了一个不可改变的 NSDictionary。
我做错了什么?
这是因为您的 属性 的 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];
你需要担心这一行:
@property (copy, atomic) NSMutableDictionary * thisParticularWordList;
因为 属性 的 setter 复制了您的可变集合并使其成为 不可变 之一;这就是为什么您稍后会崩溃的原因。
您可能需要考虑只保留强引用而不是复制它,例如:
@property (strong, atomic) NSMutableDictionary * thisParticularWordList;