0

奇妙な理由で、golferStats は情報を正しく保存していません...

私はこのコードの多くのものを基本的なものに切り取りましたが、なぜまだ機能していないのですか?

問題:最後の NSLOG は、巨大な配列を返す必要があるときに nil を返します...

NSMutableDictionary *golferStats = [[NSMutableDictionary alloc] init];
golferStats = [userDefaults objectForKey:@"golferStats"];

[golferStats setObject:golferTwoIconCounter forKey:golferName]; //golferName is k

[userDefaults setObject:golferStats forKey:@"golferStats"];
[userDefaults synchronize];
NSLog(@"SAVED SCORE CARD");
NSLog(@"%@",[golferStats objectForKey:@"k"]);
4

2 に答える 2

2

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

golferStats = [userDefaults objectForKey:@"golferStats"];

...

[golferStats release];

最初に を作成してNSDictionaryから、その上に割り当てるため、メモリがリークし、おそらくnilユーザーのデフォルトから戻ってきます。 ディクショナリでは何もしないので、それをユーザーのデフォルトに戻していますsetObject:forKey:nil

編集:

最初に辞書があるかどうかを確認してみてください。

NSDictionary *golferStats = [userDefaults objectForKey:@"golferStats"];
if (golferStats == nil) {
    golferStates = [NSDictionary dictionary]; // this will not leak
}
...
于 2012-06-01T18:30:36.123 に答える
1

辞書が既に存在する場合に既存の内容を保持したい場合は、次のようにします。

NSMutableDictionary *golferStats = [userDefaults objectForKey:@"golferStats"];
if (!golferStats) golferStats = [[[NSMutableDictionary alloc] init] autorelease];

[golferStats setObject:golferTwoIconCounter forKey:golferName];
[userDefaults setObject:golferStats forKey:@"golferStats"];
[userDefaults synchronize];

// no [golferStats release] because of autorelease above
于 2012-06-01T18:46:21.430 に答える