如何在 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

NSUserDefault 更新公式

NSUserDefault的使用

将图像保存在 NSUserDefault 并进入其他 ViewController

Xcode 中的 NSUserDefault