Iphone iOS,NSMutableDictionary

Iphone iOS,NSMutableDictionary,iphone,objective-c,ios,nsmutabledictionary,Iphone,Objective C,Ios,Nsmutabledictionary,我在项目中遇到了一个问题,我在头文件中声明了NSMutableDictionary属性,如下所示: @property (copy, nonatomic) NSMutableDictionary *DataDict ; 现在在实现文件中,我继续初始化这本词典,因为我将使用它,如下所示: DataDict = [[NSMutableDictionary alloc]init]; 现在,当我这样做时,当我尝试向字典添加内容时,我会收到以下错误消息: -[\uuu-nsyi setObject:f

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

@property (copy, nonatomic) NSMutableDictionary *DataDict ;
现在在实现文件中,我继续初始化这本词典,因为我将使用它,如下所示:

DataDict = [[NSMutableDictionary alloc]init];
现在,当我这样做时,当我尝试向字典添加内容时,我会收到以下错误消息:

-[\uuu-nsyi setObject:forKey:]:发送到实例0x885ae60 2012-10-19 16:51:56.040测试的未识别选择器[2297:c07]* 由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:'-[\uu nsyi setObject:forKey::无法识别的选择器已发送到实例0x885ae60'

过了一会儿,我在项目中运行了一千次,我决定取消对初始化行的注释,如下所示

 //DataDict = [[NSMutableDictionary alloc]init];
这就解决了问题


我的问题是:为什么

这是因为属性具有“copy”属性,所以NSMutableDictionary实例alloc/init ed是使用“copy”方法“copy”的,而“copy”方法创建的不是NSMutableDictionary,而是NSDictionary。(“mutableCopy”将创建NSMutableDictionary)

也许,您可以使用“保留”而不是“复制”作为属性

@property (retain, nonatomic) NSMutableDictionary *DataDict ;

或者,不使用“复制”/“保留”,而是使用ARC(自动引用计数)。

问题在于您定义属性的方式。如果将其更改为:

@property (strong, nonatomic) NSMutableDictionary *DataDict ;
不要复制,一切都应该很好

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

您可以在上找到更多信息


正如旁注:objective-c IVAR通常以小写字母开头(类使用大写名称),因此
dataDict
应该优先于
dataDict
,我有这个确切的问题。保留/复制/强/弱等组合都不能奏效。其工作原理是创建一个临时可变字典,加载它,然后将我的原始字典设置为它

 NSMutableDictionary * tempD = [[NSMutableDictionary alloc] init];

[tempD setObject: epsTapeCut forKey:LWPrintParameterKeyTapeCut];
[tempD setObject: epsCopies forKey:LWPrintParameterKeyCopies];
[tempD setObject: epsHalfCut forKey:LWPrintParameterKeyHalfCut];
[tempD setObject: epsPrintSpeed forKey:LWPrintParameterKeyPrintSpeed];
[tempD setObject: epsDensity forKey:LWPrintParameterKeyTapeWidth];

self.ePSprintSettings = tempD;
这失败了:

 [self.ePSprintSettings setObject: epsTapeCut forKey:LWPrintParameterKeyTapeCut];
声明:

 @property (nonatomic, retain) NSMutableDictionary *ePSprintSettings;
(但同样,属性的组合不会有什么不同。)

初始化:

 self.ePSprintSettings = (NSMutableDictionary *)[myUserDefaults dictionaryForKey:kEpsPrintSettings];
谢谢你帮我理解


我很高兴这能起作用,但我想知道为什么。

这是否意味着我应该使引用变强,然后alloc init?或者使它强大,而不需要alloc init?通过使其
strong
你只是说你想与该对象保持强大的关系(拥有)(这基本上意味着你想在所有者解除分配时解除分配)。您仍然必须像往常一样alloc/init对象。