2014-12-25 40 views
2

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

回答

4

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

在你的情况friendList数组可以包含大量的数据,所以我比较喜欢NSKeyedArchiver。为了存储postCount,你可以使用NSUserDefaults。

+0

谢谢你的回答。正是我所期待的。圣诞节快乐! – Kex

+0

@Kex:圣诞快乐... –

3

NSUserDefaults类提供用于访问公共类型,如浮筒双打整数布尔,和网址方便的方法。默认对象必须是属性列表,即,(或对集合的实例的组合)的实例:NSDataNSStringNSNumberNSDateNSArray,或者NSDictionary。如果要存储任何其他类型的对象,则通常应将其存档以创建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]; 
+1

好吧,非常感谢,只是想检查一下常见的编程习惯在哪里存储简单的程序数据。谢谢您的回答。圣诞节快乐! – Kex

+0

@Kex圣诞快乐! – user3575114

2

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

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

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

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

这实际上取决于您正在保存的内容,如何使用以及如何使用这些内容。

相关问题