2011-05-30 7 views
0

私はallAvailableServicesというNSArrayを使用しています。 最初にそれを初期化して書いた後に[allAvailableServices release]; 私は条件if(allAvailableServices)をチェックしました。 それは本当に来た! 私は理由を知っているかもしれません。 (allAvailableServices)がfalse.is私はdidnの場合、私は新しいarray.soを割り当てる必要があるたびallAvailableServices = nil私はallAvailableServices = nil;nilとreleaseの問題?

[allAvailableServices release];を書いたすべての問題が来た場合 はその後、私は上記のコードallAvailableServices = nil;[allAvailableServices release]; を書きました電話は[allAvailableServices release];私は正しいと思います。私は正しいですか? 誰かが私にそれに対処する最善の方法を提供できますか?

答えて

7

リリースはメモリを再要求しますが、ポインタ値は変更されません。まだ値が入っていますが、ゴミを指しています。

これは、それを解放した後、そのポインタはnil多くの人々が理由です:Objective-Cで

[allAvailableServices release], allAvailableServices = nil; 

を、nilにメッセージを送信するために安全ですが、5月にリリースされているオブジェクトにメッセージを送りますアプリケーションをクラッシュさせる(通常はEXC_BAD_ACCESSで)

オブジェクトを解放してからnilに設定することに注意してください。逆の方法で行うと、リリースメッセージを送信するポインタが失われてしまい、オブジェクトが漏洩してしまいます。

1

アクセサーを使用する場合は、値を直接nilに設定することができます。リリースを呼び出し、それらをnilに設定します。解放は参照カウントを1減らし、0に達するとオブジェクトは解放されます。

メモリには、nilに設定されていない場合でもif値に問題があります。

アクセサーを使用し、self.yourvariable = nil;に電話するのがクリーナーです。

+0

+1プロパティを提案するため。 ivarsの代わりに[Properties](http://programmers.stackexchange.com/questions/36262/what-guidelines-do-you-suggest-for-using-objective-c-properties/78328#78328)が役立ちます*たくさんの*メモリの問題を回避します。 –

関連する問題