2011-01-21 14 views
1

私は2つのIBOutletsを持つナビゲーションコントローラスタックの一部としてView Controllerを持っています。 viewDidUnloadでは、私はそれらを解放する:deallocでIBOutletをリリースする必要がありますか?

- (void)viewDidUnload 
{ 
    self.myView1 = nil; 
    self.myView2 = nil; 
    [super viewDidUnload]; 
} 

しかし、私はまだ漏れがあった。だから私は彼らのためのdeallocのリリースメッセージを貼り付けた:

- (void)dealloc 
{ 
    [myView1 release]; 
    [myView2 release]; 

    [super dealloc]; 
} 

これはメモリリークをクリアするように見えます。しかし、私は常に私がalloc、copyまたはnewを使って作成したivarsをリリースすべきだと言われました。だから、私はこれら二つのリリースがここにあることを心配している。これは間違いありませんか?私は矛盾した意見を得続けているので誰かが私にこのことを説明してもらえますか...ありがとう!

答えて

8

@propertyオブジェクトのいずれかがretainまたはcopyと宣言されている場合は、deallocにリリースする必要があります。これにはアウトレットが含まれます。

+2

ありがとうございました。私は "alloc、copy、またはretain"のルールを聞いていましたが、ロード時にXIBがそれを保持しているという事実を本当に考慮しませんでした。私はこれを私の心に浸してみよう! – jowie

1

IBOutletを使用することにより、変数はInterface Builderで接続されるように公開され、ビューコントローラが初期化されるときに割り当てられます。したがって、ビューコントローラはアンロードされ、割り当てが解除されるため、解放および割り当て解除が必要です。ほとんどのIBOutletはUI *プロパティのままであるため、これが必要です。

変数にnilsを割り当てることは、技術的には割り当てを解除しません。これは単に、実際に割り当てを解除する直前のカウント0を保持する最後の状態です。

また、自己を使用して参照されていることに注意してください。つまり、ビューコントローラからの参照は、割り当てではなくnilになります。だから、結論で、IBOutletプロパティがのdeallocで解放されなければならない

()

(私はかなり確信していますが、他の誰かがこのために100%正しい答えを提供することができる。)

+0

ドット形式のアクセサーを使用してプロパティをnilに設定し、プロパティが(保持)タイプの場合は、以前にそこにあったオブジェクトを解放します。プロパティ設定ツールは次のようになります(擬似コード)[myProperty release]; myProperty = newObject; [newObject retain]; – averydev

1

基本的な、安全なパターンがあります

  • 宣言IVAR
  • はdeallocを
  • 離型性IVAR用IBOutletプロパティを宣言します
  • は専用のプロパティを参照し、XIBが最初にあったかもしれないものは何でも放出する、プロパティを設定します

をIVARことはありません。

なぜそのリークがあったのか少し混乱しています。プロパティをnilに設定すると、古い参照が解放されます。おそらく、viewDidUnloadは呼び出されていないでしょうか?あなたもviewDidUnloadが必要なのですか?

+0

ええ、viewDidUnloadが呼び出されることはありませんでした。私はStackについて見てきましたが、多くの人がこれを言っています... OSが再び必要になった場合に備えてキャッシュしていると思いますか?私はviewDidUnloadはメモリ警告があるときに呼び出されると思うが、それは与えられていない。 – jowie

関連する問題