Iphone NSMutableDictionary的NSInvalidArgumentException/copyWithZone异常
我有一个封装ABRecordID的类,当它用作添加到NSMutableDictionary的键时,我会得到运行时异常: “NSInvalidArgumentException:*** -[MyRecordId copyWithZone:]:发送到的选择器无法识别 “实例” MyRecordId声明为:Iphone NSMutableDictionary的NSInvalidArgumentException/copyWithZone异常,iphone,Iphone,我有一个封装ABRecordID的类,当它用作添加到NSMutableDictionary的键时,我会得到运行时异常: “NSInvalidArgumentException:*** -[MyRecordId copyWithZone:]:发送到的选择器无法识别 “实例” MyRecordId声明为: @interface MyRecordId : NSObject { ABRecordID abRecordId; } -(id)initWithId:(ABRecordID)anABR
@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',应该为你工作。请记住,它不会为你保留你的目标当然…亲爱的上帝,这也正是我的问题,谢谢