2012-03-15 9 views
1

いつ私は.hファイルで宣言され、my.mファイルviewdidloadに割り当てられたオブジェクトを解放する必要がありますか? Autoreleaseは私にエラーを与えます。iOS:メンバーオブジェクトを解放するのはいつですか?

-(void)dealloc{ 

} 

メソッド(プロパティなど)でそれらを解放する必要がありますか?

Thxを

+0

私はあなたがそのObjのためのメモリを割り当てていません。 –

+0

alloc、mutableCopy、new、copyを使用している場合はメモリを割り当てます。あなたは解放する。 –

答えて

4

まず、[スーパーのdealloc]を追加し、それは重要です:

-(void)dealloc{ 
    [var1 release], var1 = nil; 
    [var2 release], var2 = nil; 
    [super dealloc]; 
} 

第二に、はい、あなたが保持しているインスタンス変数を手動で解放する必要があります。

+0

は[super dealloc]です。常にdeallocメソッドの最後の文?それはしばしば最初のものとして見た.. – user944351

+0

決して決して、あなたのdeallocメソッドの途中に入れないでください。あなたのサブクラス変数はスーパークラス変数に大きく依存しているかもしれないので、サブクラスは安全性の問題のために最初に解放されなければなりません。シンプルなサブクラス化で、最初の[super dealloc]は機能しますが、メソッドの最後に書くのに慣れておくことをお勧めします - コードを簡単に拡張可能にし、よりプロフェッショナルに見せてください。また、[super dealloc]を省略すると、アプリケーションはクラッシュせずにメモリリークを引き起こします。 –

+0

ありがとうございました! – user944351

2

あなたはARC(Xcodeの最新バージョンではデフォルト)を使用している場合は、そのリリースが自動的に挿入されている/保持し、あなただけのあなたがする必要がある場合の参照を維持する(オブジェクトグラフを心配する必要はありオブジェクトを使用し、循環参照を避ける)。

そうでない場合は、deallocがメンバー変数を解放する正しい場所であることが間違いありません。 viewDidLoadで作成されたものの場合は特にそうですが、コントローラの寿命の間、ビューが複数回ロード/アンロードされる可能性があるので、viewDidUnloadを使用してこれらのオブジェクトを解放することを検討してください。

0

ARC(自動参照カウント)を使用している場合は、そうではありません。それはあなたのために自動的に行われます。 ARCを使用していない場合は、通常のようにdeallocで手動​​で行います。 releaseretain、またはautoreleaseとオブジェクトにしようとすると、新しいプロジェクトでARCが自動的に使用され、ARCによってエラーが表示されることに注意してください。

+0

いいえ、私はこれをサポートしていない外部ライブラリのためにarcを使用していません。 – user944351

0

はい、一般的にはdeallocでリリースします。しかし、それらがviewDidLoadで作成されている場合は、特に、viewDidLoadが呼び出されたときにオブジェクトを現在の状態で再作成することができる場合は、viewDidUnloadにそれらを解放(ivarをnilに設定)したいことがあります。

もちろんARCを使用している場合は、deallocにイールズを明示的にリリースする必要はありません。これはARCがdeallocの実装を生成するためです。

+0

私はいつもオブジェクトを解放してnilする必要がありますか? – user944351

+0

'viewDidUnload'では、確かにyesです。 'dealloc'では、それは依存します。それはそれらを「拒否」することはありませんが、あなたはそれについてもっと多くの質問を読むことができます:-)。 – mattjgalloway