哪里存储局部变量? NSKeyedArchiver还是NSUserDefaults?

时间:2014-12-25 06:27:26

标签: ios xcode nsuserdefaults nskeyedarchiver

这里有一个菜鸟但是为应用程序保存简单变量/数组的最佳方法是什么?例如,我有一个具有friendList数组的应用程序,我希望每次应用程序启动时都加载它?它会是NSKeyedArchiver吗? NSUserDefualts?或者其他一些方式?另一个例子是说我有一个简单的int变量postCount来跟踪发布的帖子数量,这需要在退出和加载时保存。什么是最好的方法?谢谢!

3 个答案:

答案 0 :(得分:4)

NSUserDefaults最适合少量数据。 如果数据较小,则更好的选项为NSUserDefaults,否则请使用NSKeyedArchiver

在你的情况下friendList数组可以包含大量数据,所以我更喜欢NSKeyedArchiver。对于存储postCount,您可以使用NSUserDefaults。

答案 1 :(得分:3)

NSUserDefaults类提供了访问常见类型的便捷方法,例如浮点数双打整数布尔值网址。默认对象必须是属性列表,即(或集合的实例组合)的实例:NSDataNSStringNSNumberNSDateNSArrayNSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData的实例。 存档和序列化是两种可以创建与体系结构无关的分层数据字节流的方法。然后可以将字节流写入文件或传输到另一个进程,可能通过网络。解码字节流时,将重新生成层次结构。档案提供了相关对象和值集合的详细记录。序列化仅记录属性列表值的简单层次结构。

您可以使用NSArray存储NSUserDefault,但更好的方法是 您应该使用类似NSKeyedArchiver的内容将数组序列化为NSData,将其保存到NSUserDefaults,然后再使用NSKeyedUnarchiver对其进行反序列化:

NSData *serialized = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[[NSUserDefaults standardUserDefaults] setObject:serialized forKey:@"myKey"];

//...

NSData *serialized = [[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:serialized];

答案 2 :(得分:2)

与UserDefaults相关的少量与应用程序设置相关的数据很容易保存。但是不要把用户名和密码放在那里 - 这就是钥匙串的用途。

如果您只想存储数组和字典,那么使用NSKeyedArchiver进行序列化是一种合理的解决方案。

然而,这是工程权衡之一,如果您有大量数据或数据结构可能会发生变化,那么使用适当的持久性机制是一个更好的主意。

适当的持久性机制,如CoreData,Realm.io,Mantle,可以更好地控制模型对象的内存使用,更好地进行缩放,当模型对象发生变化时,就可以支持正确的迁移。

这实际上取决于您的保存方式,使用方式以及使用方式的发展方式。