2009-03-28 11 views
1

自分のiPhoneアプリケーションでは、値を格納するためにnsstring変数をいくつか使用しています。しかし時々その価値は無効になります!誰かが理由を知ることができますか?または、nsstring変数が無効になる状況を教えてください。NSStringが無効になることがありますか?

答えて

0

はあなたにやったコピーまたは NSStringのを保持?

2

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

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

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

+0

ああ、あなたはパンチに私を打つ持っているように見えました。とにかく、あなたはおそらく "それが解放されたことを止める"ことを望んでおり、自己を使わない限り、プロパティは保持/解放しません。property = fooの代わりにproperty = foo;その区別を明示的に追加すると良いかもしれません。 – lhunath

4

NSStringもオブジェクトです。彼らは同じメモリ管理ルールを使います。これらのルールに対して罪を犯すと、無効なメモリへのポインタが得られ、 "無効な"データのように見えます。例えば

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

これは、自動解放に持ってNSString*を作成します。あなたがそれを参照している間に、自動解放プールがすぐに0に戻って保持カウントを入れて、deallocを送信しているivarに割り当てるときに!

いたずら。

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

これは所有参照を返す:

代わりに、または使用を保持するいずれか。 [myString release];deallocに覚えておいてください。

これは、不良メモリ管理の1つの例です。オブジェクトライフサイクルを適切に管理する方法に関するドキュメントを読んでください。本当に。

2

iPhoneのようにリソースがかなり限られているデバイスの場合は、静的な便利な方法よりも[[NSString alloc] init*]を使用する必要があります。自動解放プールを少なくしてメモリ使用量を減らすからです。プールはメッセージループごとに排水されるので、列挙するオブジェクトが少なくなります。

ローカルの自動解放プールを管理しない限り、ループ内の自動解放オブジェクトは多くのゴミを生成することにも注意してください。

0

私は同じ質問をしました。そして、以下の答えは利便性の良さでした。ただ、使用:

[myString retain]; 

そしてdeallocメソッド(例えばviewDidUnload)に:

[myString release]; 
関連する問題