2011-01-05 6 views
1

私はiPadアプリケーションを完成させています。それは私のクラスでdeallocのメソッドをすべて埋め込むことを意味します。iOS SDK - dealloc実装 - 最初に子ビューを解放しますか?

私のペン先には多くのビューがあり、そのほとんどにサブビューが含まれています(UIViewUILabelなど)。親を解放する前に子ビューをリリースする必要がありますか?親ビューが解放された場合、子ビューも解放されますか?

サンプル:

-(void)dealloc 
{ 
    [super dealloc]; 
    [childView release]; // Do I need this if I use the next line? 
    [parentView release]; // Will this perform the line above? 
} 

両方childViewparentViewは私のビューコントローラのプロパティです。両方とも保持されています。

答えて

9

が保持しているもの(明示的にまたは保持されたプロパティを問わず)は、メモリ管理が均衡するために解放する必要があります。

dealloc実装の最後では、開始時ではなく[super dealloc]を呼び出す必要があります(たとえば、その時点で使用可能なスーパークラスリソースに依存する可能性があるため)。

+0

'childView'と' parentView'はともにmyクラスのプロパティで、両方とも保持されます。この例では、 'childView'は' parentView'の前にリリースされるべきですか、それとも重要ではありませんか? –

+0

@Evan Mulawskiあなたのプロパティを解放する順序は、狂ったことをするカスタムアクセサを持たない限り問題にはなりません。 –

+0

親ビューに子ビューへの参照が含まれている必要があるため、問題はありません。したがって、親のためのdeallocが呼び出され、子供に最終リリースを行うまで、子は解放されません。 – Winder

1

サブビューがNIBから指定されているので、viewDidUnloadメソッドに細心の注意を払う必要があるようです。

nibから自動的に割り当てられたビューは、アウトレットをnilに設定することで暗黙的に解放できます。例:あなたがすることを計画しているよう

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    self.subviewOutletOne = nil; 
    self.subviewOutletTwo = nil; 
} 

は、その後、あなたが明示的に保持して任意のオブジェクトのために、あなたがdeallocメソッドでそれらを解放:

- (void)dealloc { 
    [myDataArray release]; 
    [coolAnimatedImage release]; 
    [myCustomSubview release]; 
    [super dealloc]; 
} 

LEAKS機器をチェックしてください。これは、組み込みのリーク解析ツールを使用するためのランダムなチュートリアルです。他にも良いものもあります。それは最初に立ち上がって走る痛みですが、それは完全に価値があります。

+0

保持されたビュー(明示的または暗黙的)は** ** viewDidUnloadとdeallocの両方でリリースする必要があります。前者は、View Controllerが解放される前に呼び出される保証はありません。 –

+0

あなたは、ビューがnibによって "unfrozen"されているとき、私はそれを 'dealloc'で解放すべきですか?私はこれまで聞いたことがありません。 – Winder

+0

http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36の「特別な考慮事項」を参照してください。最後の2つの段落はhttp://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html#//apple_ref/doc/uid/TP40004998-SW1 –

2

ちなみに、あなたがアプリケーションの作業を終えるまで、デアロック書き込みを保存するのは逆の方法です。私はそれが家での清掃作業のように思えますが、実際にはあなたがメモリを適切に管理するまでは、あなたのアプリが実際にどのように実行されているかについて非常に歪曲した見方をするでしょう。

@synthesizeステートメントを記述するときに、dealloc呼び出しを書くのが理想的です。つまり、クラスにプロパティを追加し、それを保持されたプロパティとして設定し、@synthesizeおよび-releaseコードを記述します。そうすれば、あなたのメモリ管理は基本的にはクリーンです(とにかくクラスプロパティレベルで)、あなたは自信を持ってコードを書くことができます。

+0

にあります。私は通常、ヘルパークラスを構築するときにこれを行い、プロパティの数は2つまたは3つを超えていません。私が常にユーザーインターフェイスを変更したりコントロールの名前を変更しているとき、これは面倒なことがあります。 –

関連する問題