2012-02-13 10 views
1

まだリリースされていないオブジェクトをリリースするメソッドを作成しようとしています。私はこれを私のViewControllerのdeallocメソッドに追加します:Objective-Cでオブジェクトを解放していません

for (id object in [self.view subviews]){ 
    NSLog(@"/n") ; 
    NSLog(@"%@", object) ; 

    if([object isKindOfClass:[UIView class]]){ 
     if (malloc_size(object)>0) { 
      NSLog(@"-> Releasing object with size: %zd", malloc_size(object)) ;  
      [object release] ; 
     } 
    } 
} 

残念ながら、アプリケーションがクラッシュします。私は間違って何をしていますか?

+2

これはちょうどUI GCで厄介な試みのように見えますが、あなたがそれを行う必要があると思った解決しようとしている問題は何ですか? – AnthonyBlake

+0

なぜこれらをリリースしようとしていますか?あなたはそれらを保持しましたか?一般に、サブビューを手動で保持/解放する必要はありません。これはUIView基本クラスによって処理されます。 – smparkes

+0

私はすべてのオブジェクトをリリースしていることを確認しようとしていましたが、私がここで見ることができる限り、正しい方法ではありません。どうもありがとう! – RGML

答えて

4

私は間違っていますか?

あなたの保持とリリースのバランスをとっていません。あなたの例では、このようなコードは必要ありません。あなたが何かを保持している場合は、それを完了したときにリリースします。それ以外のものはトラブルを求めています。

このコードでは、具体的には、すべてのビューのサブビューを解放しています。あなたのコードはこれらのビューのそれぞれを保持していましたか?いいえ、あなたはそれらを解放するべきではありません。はいの場合、なぜ?あなたはそれぞれに別々に言及していますか?あなたのビューは、あなたがサブビューとして追加するビューを保持します。あなたはそれらに他の言及があるなら(そして、それを保持しない人もいるかもしれない人もいます)、それらを保持する必要があります。

+0

私に感謝して、多くの感謝! – RGML

1

すでにリリースされている可能性があり、サブビューとして保持しているビューのみが保持するオブジェクトを解放します。あなたのリリースでは、スーパービューからビューが削除されないため、ビュー階層内の死んだオブジェクトになります。これは、ビューの割り当てが解除されるか、すべてのサブビューが再描画されるときにクラッシュします。

1

ほとんどの場合、スーパービューからビューを削除する必要があります。それ以外の場合は、スーパービューが必要とするか、参照を維持するオブジェクトを解放します。

これを行うべきではありません。保持と解放のバランスをとるべきです。

これは私が実際に知りません:malloc_sizeを使用するのは正しいですか?

関連する問題