我有一个“MainClass”类。该类实现NSCoding协议。在那个类中,我有一个包含另一个类“Object”的对象的数组,它也实现了NSCoding协议。当我在NSUserDefaults中归档“MainClass”对象然后取消归档它并尝试从数组中获取类“Object”的对象并使用它属性然后我得到消息:
[NSConcreteMutableData property]:发送到实例的无法识别的选择器。
我做错了什么?如何解决?
编辑: 这是我与NSUserDefaults一起使用的代码:
- (Settings *) readData
{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSettings = [currentDefaults objectForKey:@"data"];
if (dataRepresentingSettings != nil) {
return (MainClass *)[NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSettings];
}
return nil;
}
- (void) saveData
{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:self] forKey:@"data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
答案 0 :(得分:1)
有两种选择:
(1)您没有保留从用户defualts获得的Object。当你从NSUserDefaults
获得一个自动释放的对象时 - 如果你想保留它,你必须retain
它。
(2)你忘记了解开它。您使用NSKeyedArchiver
归档了您的对象但未取消归档它:)
Object *object = [defaults objectForKey:@"object"];
而不是
NSData *data = [defaults objectForKey:@"object"];
Object *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
注意:不要忘记我的示例中的object
仍然是自动释放的;如果你想保留它,你必须保留它;)