如何在 NSUserDefault 中保存我的数据类型?
Posted
技术标签:
【中文标题】如何在 NSUserDefault 中保存我的数据类型?【英文标题】:How to save My Data Type in NSUserDefault? 【发布时间】:2012-08-03 02:23:22 【问题描述】:我想在 NSUserDefault 中临时保存我的数据类型。这个数据后来拉回来了。
我尝试了以下代码。
MyObject *myObject = [[MyObject alloc] init];
[[NSUserDefaults standardUserDefaults] setObject:myObject forKey:@"kMyObject"];
但控制台会显示以下消息给我发短信。
-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<MyObject: 0x4aadb0>' of class 'MyObject'. Note that dictionaries and arrays in property lists must also contain only property values.
我可以忽略这些消息并强制退出 NSUserDefault。
MyObject *getObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"kMyObject"];
但是,不归还原始数据。 (我检查了 NSLog,返回 Null。)
如何解决这个问题?我只喜欢保存到 NSUserDefaults。不建议我使用 CoreData。
【问题讨论】:
您在保存时对其进行了编码,并在获取后对其进行了解码。[查看此链接][1] [1]:***.com/a/2315972/992774 【参考方案1】:许多开发者向 NSKeyedArchiver 推荐利用这个概念。但它必须实现 NSCopy NSCoding 的协议,因为有些可能很复杂。不仅如此,还有更简单的方法。 参考以下代码。
保存
MyObject *myObject = [[MyObject alloc] init];
NSData *myObjectData = [NSData dataWithBytes:(void *)&myObject length:sizeof(myObject)];
[[NSUserDefaults standardUserDefaults] setObject:myObjectData forKey:@"kMyObjectData"];
加载
NSData *getData = [[NSData alloc] initWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"kMyObjectData"]];
MyObject *getObject;
[getData getBytes:&getObject];
【讨论】:
这是非常糟糕的建议。 MyObject 可能包含指向其他数据的指针。sizeof()
也不是找到 Objective-C 对象的有效负载大小的正确方法。使用 NSCoding。这种方法可能适用于值语义 C 结构,但永远不适用于 Objective-C 对象。不仅如此,Load
代码还会破坏堆栈。天哪,这太可怕了!请不要这样做!【参考方案2】:
您必须确保 MyObject 实例中包含的所有对象都是属性列表 (plist) 对象。请参阅this post。
【讨论】:
以上是关于如何在 NSUserDefault 中保存我的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
NSUserDefault 无法在 iOS8 的扩展中保存和加载
如何在 appdelegate 中使用 applicationDidEnterBackground 保存 NSUserDefault