2

了解しました。コードはあります。クラッシュするバグを1つのセクションに絞り込んだと思います。ビューがロードされると、私のコードはNSUserDefaultsをロードし、それらから文字列を引き出します。次に、文字列で機能します。問題は、弦を引き抜く方法がわからないことです。

相対コードは次のとおりです。

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *nameOne = [prefs stringForKey:@"playerOne"];
NSString *nameTwo = [prefs stringForKey:@"playerTwo"];

//do stuff with the strings

[nameOne release];
[nameTwo release];

別のビューで文字列をNSUserDefaultsに配置するときのコードも次のとおりです。

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *tempName = [[NSString alloc] initWithFormat:@"You"];
[prefs setObject:tempName forKey:@"playerOne"];
NSString *tempName2 = [[NSString alloc] initWithFormat:@"Opponent"];
[prefs setObject:tempName2 forKey:@"playerTwo"];
[prefs synchronize];

NSUserDefaultsから文字列を取り出すところに問題を切り分けました。私はそれらを間違って取り出しているように感じますが、他にそれを行う方法がわかりません。StringForKeyの使用は間違っている可能性があります...またはスペースを割り当てていませんか?問題が何であるかわかりません。修正を試みましたが、役に立ちませんでした。助けていただければ幸いです!

4

3 に答える 3

2

NSUserDefaults取得した文字列がautoreleasedであるかどうかを確認することをお勧めします。私は彼らがそうであることを覚えているようです。

于 2010-01-16T00:50:40.477 に答える
1

以下のように文字列をコピーする(またはリリース行を削除する)必要があると思います

NSString *nameOne = [[prefs stringForKey:@"playerOne"] copy];
NSString *nameTwo = [[prefs stringForKey:@"playerTwo"] copy];
于 2010-01-16T00:51:30.393 に答える
0

フランクシュミットの答えを追加するには:

一般的な経験則では、メソッドの名前にallocまたはcopyが表示されない場合、明示的にretainを呼び出さない限り、呼び出し元には返されるオブジェクトの所有権がないと見なすことができます。そのため、返されるオブジェクトは自動解放プールに配置されることがよくあります。

したがって、この場合、「stringForKey」を呼び出す関数は戻り値の所有権を持たないため、releaseを呼び出す必要はありません。

また、呼び出し元の関数がスコープを離れた後も文字列を保持したい場合は、retainを呼び出す必要があります。(リリースステートメントで判断しますが、そうではありません)

私はよく知っているでしょう:http: //developer.apple.com/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

于 2010-01-16T03:53:27.220 に答える