[英]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.