1

複数のWebアドレスとラベルのクリックを処理するために、ビューにビューを追加する必要があります。私はforステートメントでそれをやろうとします。私のコードはそのようなものです:

// we have a UITabbarViewController for holding amongs other the parentViewController
UITabBarController *tabbedViewController = [[UITabBarController alloc] init];

// create the parentViewController
ParentViewController *parentViewController = [[ParentViewController alloc] initWithNibName:@"parentViewController" bundle:nil];
[parentViewController.view setNeedsDisplay];

// add parentViewController into tabbedViewController
tabbedPlayerViewController.viewControllers = [NSArray arrayWithObjects: ... parentViewController, nil];

// All the things are inside a UINavigationController
// push the view
[self.navigationController pushViewController:tabbedViewController animated:YES];

// setting up  the views individually...
// not listed here



for (NSDictionary *url in urls) {

        // init my controller with a nib file 
        UIViewController *webadressViewController = [[WebadressViewController alloc] initWithNibName:@"WebadressViewController" bundle:nil]; 

        // position the view ...
        // ... not listed here

        // add webaddress to parent view
        [parentViewController.view addSubview: webaddressViewController.view];

}

[parentViewController release];
[tabbedViewController release];

webaddressViewControllerの保持カウントが1であるため、メモリ管理の問題が発生する可能性があると思います。そのため、コードのどこかでリリースする必要があります。しかし、forブロック内でリリースすると、すべてのサブビューが消えます。

私の質問は、どうすればそのオブジェクトを解放できますか?

(問題は次のとおりです。parentViewControllerでaddSubviewを呼び出すと、webaddressViewController.viewは所有されますが、webaddressController自体は所有されません。したがって、webaddressViewControllerを解放すると、そのビューも表示されなくなります。)

4

4 に答える 4

4

URLごとにwebAdressViewControllerを作成していますが、これらのView Controllerを保持していないため、後で解放できます。このようにコーディングする場合は、webAdressViewControllers の配列を、このコードが属するオブジェクトのプロパティとして保持し、dealloc メソッドで解放する必要があります。

しかし、そもそもなぜ webAdressViewControllers を作成しているのだろうか? ビューを作成するコード以外に、webAdressViewController クラスにコードはありますか? (この時点でコントローラーを解放することについて話している場合は、そうではないと思います。) 後でコントローラーが必要ない場合は、この時点でビューを直接作成してから、それらをサブビューとして追加して解放してください。これにより、不要なビュー コントローラーを大量に保持する必要がなくなります。

また、タブ付きビュー コントローラーをプロパティとして保持し、dealloc で解放する必要があります。

parentViewController には 2 つの保持カウントがあります。1 回は alloc init 用で、2 回は配列への追加用です。このコントローラーに再度直接アクセスする必要がない場合 (つまり、タブ付きコントローラーが必要なすべてのビュー管理を行う場合) は、一度解放する必要があります。

于 2009-03-24T18:56:58.837 に答える
0

おそらく当面の問題とは無関係ですが、UINavigationController は UITabBarController のプッシュをサポートしていないことに注意してください。このSOの質問(および回答)を参照してください。

于 2009-03-24T19:07:48.657 に答える
0

メッセージを送信した直後に、ループ内の各ビューを解放する必要がありaddSubViewます。parentViewController.viewはビューを保持し、その一部としてリリースしますdealloc

これより前に解放すると、ビューの割り当てが解除されます。

逆に、parentViewController を保持する必要があります。これは、作成したビューを所有するビュー コントローラーです。解放すると、他のすべてのビューを追加したビューが解放され、順番に解放されます。

ユーザーによって閉じられたときに、parentView コントローラーを解放します。

于 2009-03-22T21:18:28.157 に答える