1

我需要向视图添加更多视图以处理多个网址和标签上的点击。我尝试在 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,但您并没有保留这些视图控制器,以便以后可以释放它们。如果你想这样编码,你还需要保留一个 webAdressViewControllers 数组作为该代码所属的任何对象的属性 - 然后在其 dealloc 方法中释放它们。

但我想知道你为什么首先创建 webAdressViewControllers ?除了创建视图的代码之外,您在 webAdressViewController 类中是否有任何代码?(如果你现在说的是释放控制器,我怀疑不是。)如果你以后不需要控制器,为什么不直接创建视图,然后将它们添加为子视图并释放它们?这将使您免于保留大量不需要的视图控制器。

您还需要将选项卡式视图控制器保留为属性,并在 dealloc 中释放它。

parentViewController 有两个保留计数 - 一次用于分配初始化,两次用于添加到数组中。如果您不需要自己再次直接访问此控制器(即,如果选项卡式控制器完成了您需要的所有视图 cmanagement),那么您应该释放它一次。

于 2009-03-24T18:56:58.837 回答
0

您应该在发送addSubView消息后立即释放循环内的每个视图。parentViewController.view将保留视图并将它们作为其dealloc.

如果您在此之前释放它们,则视图将被释放。

相反,您应该保留您的 parentViewController。这是拥有您创建的视图的视图控制器。当您释放它时,它将释放您添加所有其他视图的视图 - 依次释放它们。

当用户关闭 parentView 控制器时,您会释放它。

于 2009-03-22T21:18:28.157 回答
0

使用自动释放池,它会在不再需要时释放您分配的对象。

UIViewController *webadressViewController = [[[WebadressViewController alloc] initWithNibName:@"WebadressViewController" bundle:nil] autorelease];

或者,在循环的最后一行添加 release 语句(推荐):

[webaddressViewController release];

如果你有一个紧密的循环,就像你在这里一样,如果你使用传统的分配/释放模式,效率会更高。

如果您将代码保持原样,则会发生内存泄漏。

于 2009-03-22T23:05:40.223 回答
0

虽然可能与手头的问题无关,但请注意 UINavigationController 不支持推送 UITabBarController。请参阅此 SO 问题(和答案)。

于 2009-03-24T19:07:48.657 回答