1

私自身の iPhone アプリケーションでは、多くの nsstring 変数を使用して値を格納しました。ただし、その値が無効になる場合があります。何が原因か誰か知っていますか?または、nsstring 変数が無効になる状況について教えてください。

4

5 に答える 5

4

NSStringもオブジェクトです。それらは同じメモリ管理規則に従います。これらのルールに違反すると、無効なメモリへのポインターが取得され、「無効な」データのように見えます。

例えば:

myString = [NSString stringWithString:@"foo"];

これにより、NSString*自動解放がオンになっている が作成されます。それをivarに割り当てると、自動解放プールがすぐにポップして、保持カウントを0に戻しdealloc、参照がまだある間にそれを実行します!

いたずら。

代わりに、それを保持するか、次を使用します。

myString = [[NSString alloc] initWithString:@""];

これは、所有参照を返します。[myString release];を覚えておいてくださいdealloc

これは、不適切なメモリ管理の一例/ケースにすぎません。オブジェクトのライフサイクルを適切に管理する方法については、ドキュメントを参照してください。本当。

于 2009-03-28T08:16:33.883 に答える
2

これがiPhoneなどのリソースがかなり限られているデバイスの場合は[[NSString alloc] init*]、自動解放プールへのプレッシャーが少なくなり、メモリ使用量が少なくなるため、静的な便利な方法を使用する必要があります。プールはメッセージループごとに排出されるため、列挙するオブジェクトが少ないほど適切です。

また、ローカルの自動解放プールを管理しない限り、ループ内の自動解放オブジェクトは大量のガベージを生成することに注意する必要があります。

于 2009-03-29T06:21:03.687 に答える
2

それらは自動リリースされています。簡易メソッド (stringWithString、stringWithFormat) を使用して文字列を作成すると、自動解放プールに追加されます。

自動的に解放されないようにするには、retain メッセージと使用終了時に release メッセージを送信してメモリを解放します。文字列をメンバー変数に割り当てるときに、この半自動を行うようにプロパティを設定することもできます

iPhone (および Mac) のメモリ管理に関する多くの記事が SO とインターウェブにあります。自動解放のためのGoogle。

于 2009-03-28T07:55:35.167 に答える
0

NSStringをコピーまたは保持しましたか?

于 2009-03-28T07:16:46.290 に答える
0

私は同じ質問をしました。そして、次の答えは便宜上最高のものでした。使用するだけです:

[myString retain];

そして、dealloc メソッド (例: viewDidUnload) で:

[myString release];
于 2011-08-22T00:13:15.037 に答える