Ios NSMutableDictionary是不可变的

Ios NSMutableDictionary是不可变的,ios,immutability,nsmutabledictionary,Ios,Immutability,Nsmutabledictionary,在我的班上。h,我有 @property (copy, atomic) NSMutableDictionary *thisParticularWordList; 在myClass.m中,我按如下方式填充此特定命令列表: theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary]; 在xcode的variables视图中,我看到这个实例的属性确实被填充了 在

在我的班上。h,我有

@property (copy, atomic) NSMutableDictionary *thisParticularWordList;
在myClass.m中,我按如下方式填充此特定命令列表:

theSubview.thisParticularWordList = [NSMutableDictionary dictionaryWithDictionary: someDictionary];
在xcode的variables视图中,我看到这个实例的属性确实被填充了

在代码的其他地方,我尝试这样做:

[self.thisParticularWordList removeObjectForKey:self.theKey];
但不知何故,self.thispicularOrdList变成了一个不可变的NSDictionary


我做错了什么?

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

一个解决方案是使属性
变强
,然后在分配它时,您将执行
self.yourProperty=[yourDictionary mutableCopy]

甚至
[NSMutableDictionary dictionary with dictionary:someDictionary]因为这也会创建一个新字典


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

MyClass.h

我的班级

然后,这将在分配以下内容后起作用:

[self.thisParticularWordList removeObjectForKey:self.theKey];

这是因为属性的
copy
属性。看一看

一个解决方案是使属性
变强
,然后在分配它时,您将执行
self.yourProperty=[yourDictionary mutableCopy]

甚至
[NSMutableDictionary dictionary with dictionary:someDictionary]因为这也会创建一个新字典


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

MyClass.h

我的班级

然后,这将在分配以下内容后起作用:

[self.thisParticularWordList removeObjectForKey:self.theKey];

您需要担心这一行:

@property (copy, atomic) NSMutableDictionary * thisParticularWordList;
因为属性的setter复制您的可变集合,并使其不可变一个;这就是为什么你以后会撞车


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

@property (strong, atomic) NSMutableDictionary * thisParticularWordList;

您需要担心这一行:

@property (copy, atomic) NSMutableDictionary * thisParticularWordList;
因为属性的setter复制您的可变集合,并使其不可变一个;这就是为什么你以后会撞车


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

@property (strong, atomic) NSMutableDictionary * thisParticularWordList;


你怎么能说,这个
NSMutableDictionary
变成了一个不可变的字典?应用程序在那一行崩溃,出现错误“-[\uu NSDictionaryI removeObjectForKey:]:无法识别的选择器发送到实例0x7c3c3600'”你怎么能说,此
NSMutableDictionary
变为不可变字典?应用程序在该行崩溃,错误为“-[\u NSDictionaryI removeObjectForKey:]:无法识别的选择器发送到实例0x7c3c3600'”谢谢!将“复制”改为“强”成功了。我不得不承认,我对属性的认识是不稳定的。我现在正在研究@Sjakelien,这是一个很好的问题,请务必阅读。属性可以对代码产生很大影响,包括内存管理、代码安全甚至线程安全。如果你觉得我的答案足够,你能把它标为正确答案吗?:)我知道这里不是提问的地方,但为什么Xcode提供了很多有用的提示,但不建议我在这种情况下使用“strong”?是否存在希望NSMutableDictionary具有“copy”属性的情况?谢谢!将“复制”改为“强”成功了。我不得不承认,我对属性的认识是不稳定的。我现在正在研究@Sjakelien,这是一个很好的问题,请务必阅读。属性可以对代码产生很大影响,包括内存管理、代码安全甚至线程安全。如果你觉得我的答案足够,你能把它标为正确答案吗?:)我知道这里不是提问的地方,但为什么Xcode提供了很多有用的提示,但不建议我在这种情况下使用“strong”?是否存在希望NSMutableDictionary具有“copy”属性的情况?这看起来与10分钟前回答的答案相同。重复的目的是什么?在我看来,被接受的答案复制了我对情况的实际解释。复制了吗?但它是在你的答案之前10分钟输入的?这个答案只是对我来说是一个混乱的胡言乱语,不是真正的解决方案或解释。好吧,首先你说它复制了你的答案(即使它是在你的答案之前输入的),现在它是胡言乱语。这两点我都不同意。这看起来和10分钟前的答案是一样的。重复的目的是什么?在我看来,被接受的答案复制了我对情况的实际解释。复制了吗?但它是在你的答案之前10分钟输入的?这个答案只是对我来说是一个混乱的胡言乱语,不是真正的解决方案或解释。好吧,首先你说它复制了你的答案(即使它是在你的答案之前输入的),现在它是胡言乱语。这两点我都不同意。