简体   繁体   English

使用nsuserdefaults中的数据时,应用程序崩溃

[英]The app crashes when working with data from nsuserdefaults

I have a class "MainClass". 我有一个类“ MainClass”。 That class implements NSCoding protocol. 该类实现NSCoding协议。 In that class I have an array with objects of another class "Object", which also implements NSCoding protocol. 在该类中,我有一个包含另一个类“ Object”的对象的数组,该类也实现了NSCoding协议。 When I archive an object of "MainClass" in NSUserDefaults and then unarchive it and try to get the object of class "Object" from array and use it properties then I get message: 当我在NSUserDefaults中存档“ MainClass”的对象,然后取消存档并尝试从数组中获取“ Object”类的对象并使用其属性时,我得到以下消息:

[NSConcreteMutableData property]: unrecognized selector sent to instance. [NSConcreteMutableData属性]:无法识别的选择器已发送到实例。

What do I do wrong? 我做错了什么? How to fix it? 如何解决?

Edit: This is code I use with NSUserDefaults: 编辑:这是我与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];
}

There's two options : 有两种选择:

(1) You're not retaining the Object that you got from the user defualts. (1)您没有保留从用户默认中获得的对象。 When you get an object from NSUserDefaults it's autoreleased - if you want to keep it, you have to retain it. NSUserDefaults获取对象时,该对象会自动释放-如果要保留它,则必须retain它。

(2) You've forgotten to unarchive it. (2)您忘记了对其进行存档。 You used NSKeyedArchiver to archive your Object but didn't unarchive it :) 您使用NSKeyedArchiver来存档您的对象,但没有取消存档:)

you might have done something like 您可能已经做了类似的事情

Object *object = [defaults objectForKey:@"object"];

instead of 代替

NSData *data = [defaults objectForKey:@"object"];
Object *object = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NB Don't forget that object in my example is still autoreleased; 注意:不要忘记我的示例中的object仍然是自动释放的。 if you want to keep it, you have to retain it ;) 如果要保留它,则必须保留它;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM