在我的项目中有一个问题,我在头文件中声明了一个NSMutableDictionary属性,如下所示:
@property (copy, nonatomic) NSMutableDictionary *DataDict ;现在,在实现文件中,我继续初始化这个字典,因为我要使用它,如下所示:
DataDict = [[NSMutableDictionary alloc]init];现在,当我这样做的时候,当我试图在字典中添加一些东西的时候,我就会得到这样的错误消息:
-__NSDictionaryI setObject:未识别的选择器发送给实例0x885ae60 2012-10-19 16:51:56.040测试2297:C07*终止应用程序由于未被识别的异常'NSInvalidArgumentException',原因:‘__NSDictionaryI:forKey::未识别的选择器发送到实例0x88560’
过了一会儿,在我的项目中运行了上千次,我决定取消对初始化行的注释,如下所示
//DataDict = [[NSMutableDictionary alloc]init];这解决了问题。
我的问题是:为什么?
发布于 2012-10-19 21:08:03
问题在于你如何定义你的财产。如果将其更改为:
@property (strong, nonatomic) NSMutableDictionary *DataDict ;而不是copy,一切都应该是好的。
之所以会出现这种情况,主要是因为您希望通过生成的访问器获得对象的副本,而后者则返回一个NSDictionary (一个不可变的副本)。
您可以在目标-c特性上找到更多信息。
就像sidenote: objective通常以小写字母开头一样(大写名称用于类),所以dataDict应该比DataDict更好。
发布于 2012-10-19 21:07:12
这是因为属性具有“复制”属性,因此NSMutableDictionary实例alloc/init-ed使用“复制”方法进行“复制”编辑,而“复制”方法创建的不是NSMutableDictionary,而是NSDictionary。("mutableCopy“将创建NSMutableDictionary)。
也许,您可以使用“保留”而不是“复制”作为属性。
@property (retain, nonatomic) NSMutableDictionary *DataDict ;或者,不用“复制”/“保留”,而是使用ARC(自动引用计数)。
发布于 2020-12-03 01:12:49
我确实有这个问题。没有保留/复制/强/弱等的组合可以做到这一点。所做的工作是创建一个临时的可变字典,加载它,然后设置我的原始值。
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];谢谢你帮我理解。
我很高兴这起作用,但我想知道为什么。
https://stackoverflow.com/questions/12982346
复制相似问题