2009-03-17 7 views
0

私はscrollviewにサブビューとして追加される複数の情報ページを持つUIScrollViewを持っています。各サブビューのコントローラは、scrollViewControllerのNSMutableArrayに格納されます。サブビューの解放

私はサブビューでいくつかのメモリリークがあり、私は各サブビューコントローラのdeallocメソッドが呼び出されていることを確認することによってそれらを修正しようとしています。私は、scrollViewコントローラのdeallocメソッド内からView Controllerを解放することでこれを行います。

サブビューコントローラが解放された後にアレイを解放しようとすると、アプリケーションがクラッシュします。

コードが続きます...私は間違っていますか?

- (void)dealloc { 

// Loop through the array of subView controllers and release them 
for (int i = 0; i < [viewControllers count]; i ++) { 
    [[viewControllers objectAtIndex:i] release]; 
} 

[viewControllers release]; // Crashes here unless I remove the loop above 
[scrollView release]; 
[pageControl release]; 
[theKnot release]; 
[super dealloc]; 

}

答えて

4

NSMutableArrayそれに含まれるオブジェクトの所有権を取る - それが添加される場合、それらの参照カウントをインクリメントし、それ自体の割り当てを解除したときに、そのオブジェクトを解放します。

viewControllersアレイに配置した後に、各ビューコントローラをリリースまたは自動リリースすると仮定すると、オブジェクトをループオーバーする必要はありません。viewControllersでリリースされ、アレイが解放されます。

あなたが既にリリースして無効なオブジェクトをリリースしようとしているため、アレイを解放するときにクラッシュしています。

1

NSArrayは、割り当てが解除されるとその内容を解放します。そのため、オブジェクトはループ内で解放されている可能性があります(おそらく解放されます)。

iPhoneアプリを作成する場合は、Appleのmemory management guideをお読みください。それはそれほど難しいことではありませんが、あなたが学ばなければならないものです。そうしないと、漏れやクラッシュが発生し、その理由が分かりません。一度ココアの簡単なルールを理解すると、すべてが明確になります。