首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS,NSMutableDictionary

iOS,NSMutableDictionary
EN

Stack Overflow用户
提问于 2012-10-19 20:55:34
回答 3查看 4.8K关注 0票数 8

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

代码语言:javascript
复制
@property (copy, nonatomic) NSMutableDictionary *DataDict ;

现在,在实现文件中,我继续初始化这个字典,因为我要使用它,如下所示:

代码语言:javascript
复制
DataDict = [[NSMutableDictionary alloc]init];

现在,当我这样做的时候,当我试图在字典中添加一些东西的时候,我就会得到这样的错误消息:

-__NSDictionaryI setObject:未识别的选择器发送给实例0x885ae60 2012-10-19 16:51:56.040测试2297:C07*终止应用程序由于未被识别的异常'NSInvalidArgumentException',原因:‘__NSDictionaryI:forKey::未识别的选择器发送到实例0x88560’

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

代码语言:javascript
复制
 //DataDict = [[NSMutableDictionary alloc]init];

这解决了问题。

我的问题是:为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-19 21:08:03

问题在于你如何定义你的财产。如果将其更改为:

代码语言:javascript
复制
@property (strong, nonatomic) NSMutableDictionary *DataDict ;

而不是copy,一切都应该是好的。

之所以会出现这种情况,主要是因为您希望通过生成的访问器获得对象的副本,而后者则返回一个NSDictionary (一个不可变的副本)。

您可以在目标-c特性上找到更多信息。

就像sidenote: objective通常以小写字母开头一样(大写名称用于类),所以dataDict应该比DataDict更好。

票数 15
EN

Stack Overflow用户

发布于 2012-10-19 21:07:12

这是因为属性具有“复制”属性,因此NSMutableDictionary实例alloc/init-ed使用“复制”方法进行“复制”编辑,而“复制”方法创建的不是NSMutableDictionary,而是NSDictionary。("mutableCopy“将创建NSMutableDictionary)。

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

代码语言:javascript
复制
@property (retain, nonatomic) NSMutableDictionary *DataDict ;

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

票数 2
EN

Stack Overflow用户

发布于 2020-12-03 01:12:49

我确实有这个问题。没有保留/复制/强/弱等的组合可以做到这一点。所做的工作是创建一个临时的可变字典,加载它,然后设置我的原始值。

代码语言:javascript
复制
 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;

这是失败的:

代码语言:javascript
复制
 [self.ePSprintSettings setObject: epsTapeCut forKey:LWPrintParameterKeyTapeCut];

声明:

代码语言:javascript
复制
 @property (nonatomic, retain) NSMutableDictionary *ePSprintSettings;

(但同样,任何属性的组合都不起作用。)

初始化:

代码语言:javascript
复制
 self.ePSprintSettings = (NSMutableDictionary *)[myUserDefaults dictionaryForKey:kEpsPrintSettings];

谢谢你帮我理解。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12982346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档