私自身の iPhone アプリケーションでは、多くの nsstring 変数を使用して値を格納しました。ただし、その値が無効になる場合があります。何が原因か誰か知っていますか?または、nsstring 変数が無効になる状況について教えてください。
5 に答える
NSString
もオブジェクトです。それらは同じメモリ管理規則に従います。これらのルールに違反すると、無効なメモリへのポインターが取得され、「無効な」データのように見えます。
例えば:
myString = [NSString stringWithString:@"foo"];
これにより、NSString*
自動解放がオンになっている が作成されます。それをivarに割り当てると、自動解放プールがすぐにポップして、保持カウントを0に戻しdealloc
、参照がまだある間にそれを実行します!
いたずら。
代わりに、それを保持するか、次を使用します。
myString = [[NSString alloc] initWithString:@""];
これは、所有参照を返します。[myString release];
を覚えておいてくださいdealloc
。
これは、不適切なメモリ管理の一例/ケースにすぎません。オブジェクトのライフサイクルを適切に管理する方法については、ドキュメントを参照してください。本当。
これがiPhoneなどのリソースがかなり限られているデバイスの場合は[[NSString alloc] init*]
、自動解放プールへのプレッシャーが少なくなり、メモリ使用量が少なくなるため、静的な便利な方法を使用する必要があります。プールはメッセージループごとに排出されるため、列挙するオブジェクトが少ないほど適切です。
また、ローカルの自動解放プールを管理しない限り、ループ内の自動解放オブジェクトは大量のガベージを生成することに注意する必要があります。
それらは自動リリースされています。簡易メソッド (stringWithString、stringWithFormat) を使用して文字列を作成すると、自動解放プールに追加されます。
自動的に解放されないようにするには、retain メッセージと使用終了時に release メッセージを送信してメモリを解放します。文字列をメンバー変数に割り当てるときに、この半自動を行うようにプロパティを設定することもできます
iPhone (および Mac) のメモリ管理に関する多くの記事が SO とインターウェブにあります。自動解放のためのGoogle。
NSStringをコピーまたは保持しましたか?
私は同じ質問をしました。そして、次の答えは便宜上最高のものでした。使用するだけです:
[myString retain];
そして、dealloc メソッド (例: viewDidUnload) で:
[myString release];