2

ビュー/ビューコントローラーの大規模な階層があります。
メインコントローラーには、aViewController が MyClass のメンバーである次のコードがあります。

@implementation MyClass

...

- (void) viewDidLoad
{
    [self.view addSubview:aViewController_.view];
    [aViewController_ setDataSource:self];
    [aViewController_ setDelegate:self];
}

- (void)dealloc 
{
    //[aViewController_.view removeFromSuperview]; // All ok when this is added
    [aViewController_ release];
    [super dealloc];
}

...

@end

これを実行すると、解放されないことがわかりますaViewController-保持カウントは最後に1のままです。
ただし、 dealloc に追加[aViewController_.view removeFromSuperview];すると、すべて正常に動作します。

どうしてこれなの?[super dealloc]ビューのリリースを処理する必要はありませんか? ビューがコントローラーの後に解放されていることは重要ですか?

簡単なテストアプリケーションで再現しようとしましたが、うまくいきませんでした。

4

1 に答える 1

3

これは、ビューを aViewController_.view のサブビューとして追加しています。

[self.view addSubview:aViewController_.view];

aViewController_.viewビューを保持しているため、メインコントローラーを解放してもビューの割り当てが解除されません。これは正しいです。

「メインコントローラー」の割り当てを解除する前に、スーパービューからビューを削除する必要があります。

メインコントローラー」は解放すると消えますが、スーパービューにはまだサブビューが保持されています。

aViewController_ビューを所有しているコントローラーを解放する前に、ビューを終了したときにこれをどこかで行うことができます。

すべてのコードを見ずに言うのは難しいです。

ビューを別のビューに追加すると、スーパー ビューは削除されるまでそのビューを保持することに注意してください。

于 2011-05-10T04:12:12.253 に答える