3

ナビゲーションコントローラー上にないサブビューとしてViewController.viewを追加すると、ViewControllerを適切に作成および破棄できないことがよくあります。

例えば:

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view];  
[myViewController release];

これは、コントローラーのないビューであり、ユーザーが操作する必要のあるUIControlがない場合に最適です。ただし、そのビューのビューコントローラにメッセージを送信すると、メッセージがメモリに存在しなくなるため、EXEC_BAD_ACCESSが発生します。

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view]; 

これはメッセージの送信時に機能しますが、メモリリークであり、静的アナライザーによってキャッチされます。

現在のViewControllerのプロパティとして設定すると機能する場合があります。しかし、不明な数のMyViewControllerを使用して束を作成し、それらをUIScrollViewのようなものに追加する必要がある場合は、どちらも機能しません。

for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myTmpViewController release];
}

myTmpViewControllerにユーザー操作などがあると、クラッシュします。これを追加して適切にリリースするにはどうすればよいですか?

4

3 に答える 3

1

ビューコントローラへのポインタをivarに格納し、それをdeallocメソッドで解放することができます。

于 2011-01-31T21:55:06.570 に答える
1

NSMutableArrayを作成し、そこにコントローラーを追加できます。


for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myControllers addObject:myTmpViewController];
    [myTmpViewController release];
}

// ..

- (void) dealloc {
    [super dealloc];
    [myControllers release];
}

于 2011-01-31T21:55:34.867 に答える
0

そのようなサブビューの「制御の必要性」が限られている場合は、UIViewからサブクラス化して、ビューをそれ自体で制御することを検討できます(たとえば、独自のデリゲートになる)。

それ以外の場合は、これらのビューコントローラ(多くの場合、親ビューのビューコントローラ)の最も論理的な「所有者」を決定し、それらを所有者のivarにする必要があります。

于 2011-01-31T23:01:44.700 に答える