web-dev-qa-db-ja.com

NSUserDefaultsまたはplistを使用してデータを保存する必要がありますか?

いくつかの文字列(おそらく10〜20)を保存します。 NSUserDefaultsを使用して保存するのか、plistに書き出すのかはわかりません。ベストプラクティスと見なされるものは何ですか? NSUserDefaultsはコードの行数が少ないため、実装が迅速になります。

これらの文字列値がユーザーによって追加/削除されることを追加したいと思います。

50
Sheehan Alam

私は配列を想定していますが、辞書でも動作します。

Userdefaults、Core Data、およびPlistはすべて読み取り/書き込みが可能ですが、plistを使用する場合は、配置するディレクトリに注意する必要があります。下のplistの部分を参照してください。

コアデータやり過ぎだと思います。単なる文字列です。より複雑なオブジェクトを永続化する場合に使用することになっています。

NSUserDefaults

ユーザー設定のみを保存することになっていますが、非常に高速で簡単です。それらをuserdefaultsに書き込むには:

NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize];

Userdefaultsから読み取るには:

NSArray *stringsArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStrings"];

Plist

文字列を変更する場合は、plistを読み書きする必要がありますが、アプリのリソースに書き込むことはできません。

  1. 読み取り/書き込みplistを使用するには、まずドキュメントディレクトリを見つけます

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 配列を作成します(文字列はstring1であると仮定しています...)

    NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
    
  3. ファイルに書き込む

    [stringsArray writeToFile:stringsPlistPath atomically:YES];
    

Plistを読むには:

  1. ドキュメントディレクトリを見つける

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *stringsPlistPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];
    
  2. 読んでください:

    NSArray *stringsArray = [NSArray arrayWithContentsOfFile:stringsPlistPath];
    
83
doppioslash

10〜20個の文字列を保存し、あまり多くのコード行を探していない場合、コアデータは確かにオーバーヘッドが大きすぎます。 plistを使用することをお勧めします。多くのコード:

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"MyStrings" withExtension:@"plist"];
NSArray *stringArray = [NSArray arrayWithContentsOfURL:plistURL];
8
Mundi

iOSは最終的にすべてのNSUserDefaultsデータをplistファイルに保存します。したがって、それが懸念事項である場合、パフォーマンスには影響しません。個人的には、小さなデータにはNSUserDefaultsを使用し、比較的大きなデータセットにはplistを使用することを好みます。

注:誰でもそのデータを見ることができるため、NSUserDefaultsに機密情報を保存しないでください。

8
atulkhatri

NSUserDefaultsは、ユーザー設定をファイルにLibrary/Preferencesフォルダーに保存します。理論的には、一部のアプリケーション/ユーザープロパティを保存するだけです。

Plistファイルは、単一のファイルを管理するのに役立ちます。さらに管理する必要がある場合は、Coredataを使用する必要があります。 plistファイルのサイズに制限はありません。それ以外の場合は、plistファイルに注意する必要があります。保存または読み取りが必要な場合、ファイルの内容全体がメモリにロードされるためです。

5
Yannick Loriot

保存する内容とその理由によって異なります。 NSUserDefaultsは、ユーザー設定を保存するためのものです。他の用途に使用することもできますが、おそらく使用しないでください。

それ以外の場合、ニーズが単純であれば、plistファイルは非常に簡単です。コアデータを使用することも、独自のファイル形式を作成することもできます。一般に、単純なタスクにはplistを使用し、その後、より複雑なものにはコアデータに移動します。

2
Tim Dean

。plistを使用

  1. Xcodeを使用してplistを作成します

plistに値を書き込む

NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"settings" withExtension:@"plist"];

 NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
 [dict setValue:@"value" forKey:@"key"];
 [dict writeToURL:plistURL atomically:YES];

plistから値を読み取る

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfURL:plistURL];
NSString *myValue = [dict valueForKey:@"key"];
2
Kirit Vaghela

文字列がNSUserDefaultsに入れることができるユーザー設定だけではない場合、文字列を保存するにはplistを使用するのが良い選択です。前述のように、plistを使用するときは、自分のアプリのリソースに書き込むことができないため、plistに書き込むためにDocumentsディレクトリに保存する必要があります。これを初めて知ったとき、自分のアプリのBundleディレクトリとDocumentsディレクトリの場所が明確ではなかったので、「Strings.plist」という名前のplistを最初にコピーするサンプルコードをここに投稿すると思いました既に自分のアプリのBundleディレクトリにDocumentsディレクトリがあり、そこに書き込み、そこから読み取ります。

// Make a path to the plist in the Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *stringsPlistPathIndDoc = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Strings.plist"];

// Make a path to the plist in your app's Bundle directory
NSString *stringsPlistPathInBundle = [[NSBundle mainBundle] pathForResource:@"Strings" ofType:@".plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

// Check first that you haven't already copied this plist to the Documents directory
if (![fileManager fileExistsAtPath:stringsPlistPathIndDoc])
{
    NSError *error;

    // Copy the plist from the Bundle directory to the Documents directory 
    [fileManager copyItemAtPath:stringsPlistPathInBundle toPath:stringsPlistPathIndDoc error:&error];
}

// Write your array out to the plist in the Documents directory
NSMutableArray *stringsArray = [[NSMutableArray alloc] initWithObjects:@"string1", @"string2", @"string3", nil]; 
[stringsArray writeToFile:stringsPlistPathIndDoc atomically:YES];

// Later if you want to read it:
stringsArray = [[NSMutableArray alloc] initWithContentsOfFile:stringsPlistPathIndDoc];
2
iCMS

このようなデータを保持するための推奨される方法は、コアデータを使用することです。 NSUserDefaultsは多かれ少なかれ何かを保存するために使用できますが、設定の保存にのみ使用されることになっています。

1
user858224