Iphone NSMutableDictionary的NSInvalidArgumentException/copyWithZone异常

Iphone NSMutableDictionary的NSInvalidArgumentException/copyWithZone异常,iphone,Iphone,我有一个封装ABRecordID的类,当它用作添加到NSMutableDictionary的键时,我会得到运行时异常: “NSInvalidArgumentException:*** -[MyRecordId copyWithZone:]:发送到的选择器无法识别 “实例” MyRecordId声明为: @interface MyRecordId : NSObject { ABRecordID abRecordId; } -(id)initWithId:(ABRecordID)anABR

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

“NSInvalidArgumentException:*** -[MyRecordId copyWithZone:]:发送到的选择器无法识别 “实例”

MyRecordId声明为:

@interface MyRecordId : NSObject {
    ABRecordID abRecordId;
}

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

@end
添加到字典:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
MyRecordId *recordId = [[MyRecordId alloc] initWithId:anABRecordId];
[dict setObject:@"hello" forKey:recordId];
最后一行导致异常。。我知道不能将非对象类型存储为字典的键,但我认为将其封装在NSObject派生类中就可以了


我不应该在其他对象中存储ABRecordID吗?我应该做些别的事情吗?

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

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


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

您也可以使用NSNumber,因为它继承自NSValue。

Diederik的路径正确,但是考虑到
ABRecordID
的类型,我建议使用
NSNumber
(一个
NSValue
子类)。您可以使用
-initWithInt:
作为
ABRecordID
,它是
int32\t

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

[dict setObject:@"hello" forKey:[NSNumber numberWithInt:recordId]];
要再次获取recordId,请执行以下操作:

recordId = [[dict objectForKey:@"hello"] intValue];

对于像我这样面临编码挑战的人,请确保setObject的参数是正确的。我只是在这个错误上浪费了几个小时,才注意到我把它们颠倒了

我不知道NSValue最适合这个目的。我会用哪个初始值设定项来构造它与'ABRecordID'?我个人会用'NSValue-valueWithNonretainedObject',应该为你工作。请记住,它不会为你保留你的目标当然…亲爱的上帝,这也正是我的问题,谢谢