1

簡単なデータベースを作成し、NSUserDefaults に入れました。私のデータベースは、内部に辞書と配列を持つ NSMutableArray です。NSUSerDefaults から NSMutableArray を作成すると、NSMutableArray 内の可変オブジェクトにオブジェクトを追加できません。これが私のコードです:

NSMutableArray *arrayOne = [NSMutableArray arrayWithContentsOfFile:[self createEditableCopyOfIfNeededWithFileName:@"Form.plist"]];

NSUserDefaults *ayarlar = [NSUserDefaults standardUserDefaults];

[ayarlar setObject:arrayOne forKey:@"form"];

NSMutableArray *arrayTwo = [NSMutableArray arrayWithArray:[[ayarlar objectForKey:@"form"] mutableCopy]];

[[[arrayTwo objectAtIndex:0] objectForKey:@"itemlar"] addObject:@"hop"];

そして、ここにエラーがあります:

'NSInternalInconsistencyException'、理由: '-[__NSCFArray insertObject:atIndex:]: 変更メソッドが不変オブジェクトに送信されました'

どうすればこれを機能させることができますか?みんなありがとう。

4

4 に答える 4

5

NSUserDefaults は、データを保存する適切な場所ではありません。まず第一に、設定などの非常に少量のデータにのみ使用する必要があります。次に、可変オブジェクトを設定しても、常に不変オブジェクトを返します。配列のみが変更可能になるため、最初の配列の変更可能なコピーを作成しても役に立ちません。その配列内にあるものはすべて、mutableCopy メソッドの影響を受けず、不変のままです。

ファイルからデータを読み書きするには、NSPropertyListSerialization クラスを使用する必要があります。読み取り時に、読み取りオブジェクトの可変性を制御するオプションを渡すことができます。そこで、NSPropertyListMutableContainers または NSPropertyListMutableContainersAndLeaves を渡します。

最初に、すべてのコンテナー (つまり、配列と辞書) が変更可能になります。後者では、葉 (つまり NSString および NSData オブジェクト) も変更可能になります。

データセットがどれだけ大きくなるかによって、代わりに実際のデータベースまたは Core Data を使用する必要があります。

于 2013-06-01T19:05:52.147 に答える
2

NSUserDefaults、および一般的なプロパティ リストは、可変性を記録しません。オブジェクトがファイルから再作成されると、可変オブジェクトまたは不変オブジェクト (配列などのオプションを持つ型の場合) として構築できます。残念ながらNSUserDefaults、不変オブジェクトを直接取得するための API 呼び出しは提供されません。

あなたが持っている2つのオプションは、(a)によって返されたオブジェクトの可変コピーを作成するNSUserDefaultsか、(b)オブジェクトをプロパティリストとして別のファイルに保存することです。これにより、可変として直接読み取ることができます。

(b) については、Apple のドキュメントを参照してください。可変性の処理方法が示されています。

于 2013-06-01T19:08:39.800 に答える
2

NSUserDefaults変更可能なオブジェクトを返すことはありません。

あなたのコードは、考えられる可変配列を作成するあらゆる方法を実行しています (つまり、可変コピーを作成したばかりのものの可変コピーを作成しています)。インナー・リーフアイテム。したがって、objectForKey:@"itemlar"]可変配列に対して行うと、不変オブジェクトが返されます。

それを機能させるには、すべてのレベルで変更可能なコピーを作成する配列を反復および再帰する独自のメソッドを作成する必要があります。

または、変更可能なコンテナを生成するためにボンネットの下を掘る、このようなサードパーティのオプションを見ることもできます。NSUserDefaults

于 2013-06-01T19:04:55.130 に答える
0

method を使用して直接行うことができますinsertObject

代わりに

[[[arrayTwo objectAtIndex:0] objectForKey:@"itemlar"] addObject:@"hop"];

これを使って、

[arrayTwo insertObject:@"hop" atIndex:0];

これは、私がテストしたように機能します.finrでも機能します。その後、それを不変オブジェクトとして作成しNSARRAYNSUSERDEFAULTS.

于 2013-06-01T19:24:27.377 に答える