我应该使用NSUserDefaults还是plist来存储数据?

She*_*lam 50 iphone cocoa-touch objective-c plist nsuserdefaults

我将存储一些字符串(可能是10-20).我不确定是否应该使用NSUserDefaults保存它们,或者将它们写入plist.什么是最佳做法?NSUserDefaults似乎代码较少,因此实现起来更快.

我想补充说,这些字符串值将由用户添加/删除.

dop*_*ash 84

我假设一个数组,但它也适用于字典.

Userdefaults,Core Data和Plists都可以读/写,但是如果你使用plist,你需要注意你放的是什么目录.请参见下面的plist部分.

核心数据我认为这太过分了,它只是字符串.当你想要持久化更复杂的对象时,它应该被使用.

NSUserDefaults:

它非常快速且容易,但它应该只存储用户设置.要将它们写入userdefaults:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)

要从userdefaults中读取:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];
Run Code Online (Sandbox Code Playgroud)

Plist:

如果要修改字符串,则需要编写和读取plist,但不能写入应用程序的资源.

  1. 要有一个读/写plist,首先找到文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建数组(我假设字符串是string1,...)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将其写入文件

    [stringsArray writeToFile:stringsPlistPath atomically:YES];
    
    Run Code Online (Sandbox Code Playgroud)

阅读plist:

  1. 找到文档目录

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 阅读:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    
    Run Code Online (Sandbox Code Playgroud)

  • 我为最近使用的URL列表实现了PList解决方案.似乎PList是解决我问题的正确方法.但我不得不说,在Android上做了同样的事情之后,就学习曲线和整体努力来说,这更令人惊讶.所以我必须发表评论,并对上面的示例代码表示非常感谢... (2认同)
  • 问题...当你说"你不能写入你的应用程序资源"时,你的意思是我们不能写入我们在xcode中创建和填充的plist吗? (2认同)
  • 您只能在应用的Documents目录中写入.因此,您可以在运行时将该plist从Resources目录复制到Documents目录,然后进行编辑. (2认同)

Mun*_*ndi 8

如果您要存储10-20个字符串并且正在寻找不太多的代码行,那么核心数据肯定是过多的开销.我建议和plist一起去.不是很多代码:

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"];
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];
Run Code Online (Sandbox Code Playgroud)


atu*_*tri 8

iOS最终将所有NSUserDefaults数据存储到plist文件中.因此,如果您担心这一点,它不会影响性能.我个人更喜欢使用 NSUserDefaults小数据和plist来获取相对较大的数据集.

注意:永远不要存储任何敏感信息,NSUserDefaults因为任何人都可以看到该数据.


Yan*_*iot 5

NSUserDefaults会将用户首选项存储到Library/Preferences文件夹中的文件中.从理论上讲,它仅用于存储一些应用程序/用户属性.

Plist文件可用于管理单个文件.如果您需要管理更多,您应该使用Coredata.plist文件的大小没有限制.否则你必须小心plist文件,因为当你需要保存或读取它时,文件的全部内容将被加载到内存中.