在处理来自nsuserdefaults的数据时,应用程序崩溃

时间:2011-09-13 15:51:03

标签: iphone cocoa-touch

我有一个“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];
}

1 个答案:

答案 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仍然是自动释放的;如果你想保留它,你必须保留它;)