在iPhone中永久存储数据通常是使用核心数据或sqlite3完成的.大多数人更喜欢使用NSUserDefaults作为应用程序首选项的存储,而不是将其用作普通数据库(如sqlite).

我发现大量数据可以存储在NSUserDefaults中,非常容易使用,而且速度很快.那么为什么不把它用作永久存储呢?

Update:

  • 核心数据
  • 将对象序列化为plist
  • NSUserDefaults

我不再使用FMDB(或直接使用sqlite).

我遇到的NSUserDefaults的一些优点:

  • 使用NSPredicate可以轻松完成排序、分组等操作.
  • NSUserDefaults是线程安全的.
  • 获取数据并将其保存到NSUserDefaults需要一行.

推荐答案

NSUserDefaults提供了一个简单的学习曲线和线程安全的实现.

否则,我发现核心数据在各个方面都优于其他数据.尤其是在配置默认值和迁移 routine 方面.

编辑:事实证明,NSUserDefaults的"线程安全性"似乎来自于在主线程上运行操作.这导致我的一个应用程序出现严重的跳帧;我最终删除了NSUserDefaults,并用一个线程安全的NSMutableDictionary替换它,该字典将被序列化为一个文件.

Objective-c相关问答推荐

[NSNull new]和[NSNull NULL]有什么不同?

如何从 Cocoa 的 NSDictionary 中获取特定键的值?

我在哪里可以找到 info.plist 文件?

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

如何在for (id item in items)objective-c 循环中获取数组索引?

如何在 Cocoa 中创建字符串的 MD5 哈希?

UIRefreshControl iOS 6 xcode

iOS 应用程序下一个键不会转到下一个文本字段

更改 UINavigationBar 字体属性?

如何正确获取文件大小并将其转换为 Cocoa 中的 MB、GB?

setStatusBarHidden 在 iOS 9.0 中已弃用

静态 NSString 使用与内联 NSString 常量

如何知道 NSAssert 在发布版本中是否被禁用?

使用情节提要的条件转场

未找到 RKObjectMapping.h

无法在 Interface Builder (Xcode 5) 中创建与子视图的出口连接

从 NSMutableString 中删除最后一个字符

强制iOS应用程序崩溃的最快方法是什么?

在 Objective-C 中计算两个日期之间的天数

将参数传递给由 NSTimer 调用的方法