2

NSUserDefaults メソッドを使用してデータを保存します。int と NSMutableArray を保存します。

アプリが終了したり、バックグラウンドに入ったり、別のビューに切り替えたりすると、int が適切に保存されます。アプリがバックグラウンドに入ったときと別のビューに切り替わったときに配列が保存されますが、int と NSMutableArray にまったく同じコードを使用しているにもかかわらず、シミュレーターを終了して戻ってくるたびに保存されるわけではありません。

NSMutableArray を定義するコードは次のとおりです。

array = [[NSMutableArray alloc] init];
if ([prefs objectForKey:@"array"] != nil) {
array = [prefs objectForKey:@"array"];
}

そして、それを編集して保存します:

[array addObject:anObject];
[prefs setObject:array forKey:@"array"];
[prefs synchronize];

int には、配列部分と int 部分の間の変更を除いて、まったく同じコードがあります。

誰が何が悪いのか教えてもらえますか? 関連する多くの質問を確認しましたが、どれも私の問題を解決しませんでした。

前もって感謝します。

4

4 に答える 4

6

「NSUserDefaults から返される値は、可変オブジェクトを値として設定しても不変です。」

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

NSMutableArrayへのポインターに返される不変の NSArrayへのポインターを割り当てています。次に、 NSArray (これは効果がありません) で使用し、変更されていないNSArrayを保存します。[NSUserDefaults objectForKey:...]addObject:

(毎回 NSImmutableArray を割り当てているため、メモリ リークが発生する可能性もあります。)

于 2011-11-20T17:32:05.410 に答える
2

このコードを使用します。

これにより、NSUserDefault 値が確実に保存および取得されます。

- (void) retrieveMyState
 {
//Retrieving
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSInteger *yourIntValue = [prefs integerForKey:@"yourIntValue"];

    // convert your NSData to array, and then use it as required.   

NSData *dataRepresentingSavedArray = [prefs objectForKey:@"yourArray"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        yourArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
        yourArray = [[NSMutableArray alloc] init];
}

}


 -(void) saveMyState 
{
//saving
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

[prefs setInteger:yourIntValue forKey:@"yourIntValue"];

    // convert your array to NSData & then save it as object.

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourArray];
[prefs setObject:data forKey:@"yourArray"];

[prefs synchronize];
 }
于 2011-11-17T09:55:33.527 に答える
0

書く :

NSMutableArray* array = [NSMutableArray array];
if ([prefs objectForKey:@"array"] != nil)
    [array setArray:[prefs objectForKey:@"array"]];

NSMutableArrayを定義するとき。

于 2011-11-16T15:16:11.453 に答える
0

「int」を保存することはできません。NSObject ではありません。

しかし、配列に NSNumber を埋め込むことができ、それで節約できます。

試してください[NSNumber numberWithInt: ](Appleのドキュメントにリンクしました)。

うまくいけば、これで問題が解決します。

于 2011-11-16T15:17:40.380 に答える