2

NSUserDefaultsに空の辞書を保存するためにこれを実行しようとしました。

NSMutableDictionary* fruits = [NSMutableDictionary alloc];
[defaults setObject:fruits forKey:@"fruits"];

その後、これを取得して取得します。

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"fruits"]];

ただし、辞書を取得するとアプリケーションがクラッシュします。なんで?NSUserDefaultsに辞書を保存するにはどうすればよいですか?

4

4 に答える 4

19

不変の辞書が返されます。別の辞書に「カプセル化」する必要はありません。変更可能にするには、次のように記述します。

NSMutableDictionary* animals = [[defaults objectForKey:@"animals"] mutableCopy];

NSUserDefaultsクラスは、float、double、integers、Booleans、URLなどの一般的な型にアクセスするための便利なメソッドを提供します。デフォルトのオブジェクトは、プロパティリスト、つまり、NSData、NSString、NSNumber、NSDate、NSArray、またはNSDictionaryのインスタンス(またはコレクションの場合はインスタンスの組み合わせ)である必要があります。他のタイプのオブジェクトを保存する場合は、通常、それをアーカイブしてNSDataのインスタンスを作成する必要があります。

NSUserDefaultsから返される値は、可変オブジェクトを値として設定した場合でも不変です。たとえば、「MyStringDefault」の値として可変文字列を設定した場合、後でstringForKey:を使用して取得する文字列は不変になります。

注:NSUserDefaultsクラスを介してプログラムでアクセスするユーザーデフォルトシステムは、プロパティリストを使用して、ユーザー設定を表すオブジェクトを格納します。この制限により、NSColorオブジェクトやNSFontオブジェクトなど、多くの種類のオブジェクトがユーザーのデフォルトシステムから除外されているように見えます。ただし、オブジェクトがNSCodingプロトコルに準拠している場合は、プロパティリストと互換性のあるオブジェクトであるNSDataオブジェクトにアーカイブできます。これを行う方法については、「ユーザーのデフォルトでのNSColorの保存」を参照してください。この記事ではNSColorオブジェクトに焦点を当てていますが、この手順はアーカイブ可能なすべてのオブジェクトに適用できます。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html

于 2012-04-12T06:38:45.777 に答える
3

次を使用できます。

保存する:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mutableArray];
[[NSUserDefaults standardUserDefaults] setObject:stack forKey:@"Your Key"];

取得:

NSMutableArray *mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2012-04-12T07:15:29.320 に答える
2

辞書を初期化する必要があり、後でオブジェクトとして設定します。この方法は機能します。例と同じですが、適切に初期化されています。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"someValue", @"someKey", nil];
[defaults setObject:dict forKey:@"slovnik"];
[dict release];
NSLog(@"READ: %@", [defaults objectForKey:@"slovnik"]);
NSMutableDictionary *newDict = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"slovnik"]];
NSLog(@"READ2: %@", newDict);

これで、ログコンソールにアクセスでき、アプリがクラッシュしません。

2012-04-12 08:47:55.030 Test[12179:f803] READ: {
someKey = someValue;
}
2012-04-12 08:47:55.031 Test[12179:f803] READ2: {
someKey = someValue;
}
于 2012-04-12T06:46:41.567 に答える
0
NSMutableDictionary* fruits = [NSMutableDictionary alloc];

する必要があります

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] init];

オブジェクトを割り当てた後は、常にオブジェクトを初期化する必要があります。

于 2012-04-12T06:47:14.433 に答える