iOS,NSMutableDictionary

Kal*_*ina 6 iphone objective-c nsmutabledictionary ios

我在我的项目中遇到了一个问题,我在头文件中声明了一个NSMutableDictionary属性,如下所示:

@property (copy, nonatomic) NSMutableDictionary *DataDict ;
Run Code Online (Sandbox Code Playgroud)

现在在实现文件中,我继续初始化这个字典因为我要使用它,就像这样:

DataDict = [[NSMutableDictionary alloc]init];
Run Code Online (Sandbox Code Playgroud)

现在,当我这样做时,我尝试在此字典中添加内容的那一刻我会收到此错误消息:

- [__ NSDictionaryI setObject:forKey:]:发送到实例0x885ae60的无法识别的选择器2012-10-19 16:51:56.040 testing [2297:c07] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSDictionaryI setObject: forKey:]:无法识别的选择器发送到实例0x885ae60'

过了一会儿,我的项目运行了一千次,我决定取消注释我的初始化行,就像这样

 //DataDict = [[NSMutableDictionary alloc]init];
Run Code Online (Sandbox Code Playgroud)

并解决了这个问题.

我的问题是:为什么?

All*_*ian 15

问题在于您定义财产的方式.如果您将其更改为:

@property (strong, nonatomic) NSMutableDictionary *DataDict ;
Run Code Online (Sandbox Code Playgroud)

而不是copy一切都应该没问题.

发生这种情况是因为您基本上说您希望通过生成的访问器获得对象的副本,而后者返回NSDictionary(不可变副本).

您可以在此处找到有关objective-c属性的更多信息.

正如旁注:objective-c ivars通常以小写字母开头(大写名称用于类),因此dataDict应优先考虑DataDict.