2011-08-15 31 views
0

いくつかのビューコントローラをリリースする際に問題が発生しています。 本質的に、PhotoPostViewControllerのdeallocは決して呼び出されないようですので、その中に含まれる画像をすべてクリアすることはできません。私のUIViewControllerが正しく解放されないのはなぜですか?

これは私のUIViewControllerサブクラスです。メインスクロールビューにサブビューとして追加されたこれらのうち最大100個を持つことができます。

私のメインビュークラスでは、これらのビューを作成してscrollViewに追加する方法があります。このメソッドは、通常、ループから呼び出され、必要なすべてのサブビューを作成します。

- (void) addPost { 
    PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil]; 
    [scrollView addSubview:[postView view]]; 
    [viewControllers addObject:postView]; 
} 

viewControllerはメインクラスinitで作成されたNSMutableArrayです。 scrollViewはメインビューのUIScrollViewです。

これはすべてうまくいきますが、私はiPadでのメモリ使用量の限界を知っていて、いつでもその範囲内でポップオーバーを開いてプレビュー画像や動画などを提供します。 メモリが足りなくなりません私は画面をリフレッシュしようとします。 これを実行するコードは次のとおりです。私はすべてのサブビューをオフにクリアし、上記の関数を使用してサブビューの次のセットを再作成する前にそれらを解放しようと簡略化のために

- (IBAction)didPressRefresh:(id)sender { 
    for(UIView *subview in [scrollView subviews]) { 
     [subview removeFromSuperview]; 
    } 
    for(UIViewController *c in viewControllers) { 
     [c release]; 
    } 
    [viewControllers removeAllObjects]; 
} 

。 ビューから削除しますが、メモリが不足して新しいビューコントローラが追加されます。私のテストケースでは、ビューコントローラーのセットは内容が同じです。最初からクリーンな状態からロードすると、すべてを適切に解放すれば、2回目以降のロードが必要になります。

実際には、ビューコントローラの2番目のセットを作成するときにメモリが不足してクラッシュします。

デバッグ中 '​​viewDidUnload'と 'dealloc'メソッドにブレークポイントを設定しましたが、ヒットすることはありません。

UIViewController自体がリリースされているようですが、その中のUIImageViewsは、通常、dealloc(またはviewDidUnload)メソッドで自分のコードから解放されているはずです。

私は混乱しています。 参照カウントがうまくいくように見えます。どのようにdeallocがヒットしないのですか?あなたがviewControllersコレクションに追加した後postViewオブジェクトに-releaseメッセージを送信する必要が

アンディ

答えて

2

- (void) addPost { 
    PhotoPostViewController *postView = [[PhotoPostViewController alloc] initWithNibName:@"PhotoPostViewController" bundle:nil]; 
    [scrollView addSubview:[postView view]]; 
    [viewControllers addObject:postView]; 
    [postView release]; 
} 

コレクションが-retainメッセージを送信しますので、あなたがこれを行う必要がある理由はありますそれに追加されたすべてのオブジェクトには、メモリリークと-deallocがヒットしていません。

EDIT:

あなた-didPressRefresh:方法は次のようになります。

- (IBAction)didPressRefresh:(id)sender { 
    [[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];  
    [viewControllers removeAllObjects]; 
} 
+0

を私が実際にあることを試してみましたが、その後didPressRefreshでのリリースが問題の原因となった...ので、私はそれを除去し、デバックが再度ヒットしないバック:/ btw removeAllObjectsは保持カウントをデクリメントしませんか? –

+0

@Evaはい、 '-removeAllObjects'は、コレクション内のすべてのオブジェクトの参照カウントを減らす必要があります。 –

+0

この場合、私はallocとaddObjectをインクリメントし、[c release]とremoveAllObjectsを2として2減らして、それをリリースする必要があります。 私は[c release]と[postView release]が継承のために同じコードを呼び出すと仮定していますが、おそらくそうではなく、[c release]はPhotoViewViewController deallocではなくUIViewController deallocを呼び出します。 –

関連する問題