首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSInvalidArgumentException/copyWithZone异常与NSMutableDictionary

NSInvalidArgumentException/copyWithZone异常与NSMutableDictionary
EN

Stack Overflow用户
提问于 2009-06-25 17:45:21
回答 6查看 8.4K关注 0票数 7

我有一个封装ABRecordID的类,当它被用作添加到NSMutableDictionary的键时,我得到了运行时异常:

"NSInvalidArgumentException:* -MyRecordId copyWithZone::未识别的选择器发送到实例“

MyRecordId宣布如下:

代码语言:javascript
复制
@interface MyRecordId : NSObject {
    ABRecordID abRecordId;
}

-(id)initWithId:(ABRecordID)anABRecordId;
@property (nonatomic) ABRecordID abRecordId;

@end

在字典中添加:

代码语言:javascript
复制
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
MyRecordId *recordId = [[MyRecordId alloc] initWithId:anABRecordId];
[dict setObject:@"hello" forKey:recordId];

最后一行导致异常..。我知道您不能将非对象类型存储为字典的键,但我认为将其封装在NSObject派生类中会使其正常。

我不应该将ABRecordID存储在其他对象中吗?我应该做点别的吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-06-25 18:51:24

使用NSNumber将ABRecordID存储在Obj类中:

代码语言:javascript
复制
[dict setObject:@"hello" forKey:[NSNumber numberWithInt:recordId]];

要再次获得recordId,请执行以下操作:

代码语言:javascript
复制
recordId = [[dict objectForKey:@"hello"] intValue];
票数 7
EN

Stack Overflow用户

发布于 2009-06-25 17:51:57

NSDictionary密钥需要实现NSCopying协议。这就是为什么它告诉您您的对象不响应copyWithZone:

票数 6
EN

Stack Overflow用户

发布于 2009-06-25 17:53:24

作为键值的对象的类应该符合NSCopying协议。基本上,它应该实现copyWithZone:方法。

与其使用自己的类包装非对象变量,不如使用NSValue类,它是为此目的而设计的,支持NSCopying协议。

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

https://stackoverflow.com/questions/1045270

复制
相关文章

相似问题

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