Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone内存管理问题(将子视图添加到for语句中的视图)_Iphone_Objective C_Memory Management_View - Fatal编程技术网

iPhone内存管理问题(将子视图添加到for语句中的视图)

iPhone内存管理问题(将子视图添加到for语句中的视图),iphone,objective-c,memory-management,view,Iphone,Objective C,Memory Management,View,我需要添加更多的意见,以处理多个网址和标签点击视图。我试着用for语句来表达。我的代码是这样的: // we have a UITabbarViewController for holding amongs other the parentViewController UITabBarController *tabbedViewController = [[UITabBarController alloc] init]; // create the parentViewController P

我需要添加更多的意见,以处理多个网址和标签点击视图。我试着用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作为保留计数,所以它需要在我的代码中的某个地方释放。但是如果我在所有子视图的块中释放它

我的问题是如何释放这些对象

(我认为问题如下:
当我在parentViewController上调用addSubview时,它将拥有webaddressViewController.view,而不是webaddressController本身。因此,如果我释放webaddressViewController,它的视图也将消失。)

您应该在发送
addSubview
消息后立即释放循环中的每个视图
parentViewController.view
将保留视图,并将其作为其
dealloc
的一部分发布

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

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


当用户解除parentView控制器时,您可以释放它。

您应该在发送
addSubView
消息后立即释放循环中的每个视图
parentViewController.view
将保留视图,并将其作为其
dealloc
的一部分发布

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

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


当用户解除parentView控制器时,您可以将其释放。

使用自动释放池,该池将负责在不再需要时释放您分配的对象

UIViewController *webadressViewController = [[[WebadressViewController alloc] initWithNibName:@"WebadressViewController" bundle:nil] autorelease];
或者,在循环的最后一行添加发布语句(推荐):

如果您有一个像这里一样的紧密循环,那么使用传统的alloc/release模式将更加有效


如果代码保持原样,则表示内存泄漏。

使用自动释放池,该池将负责在不再需要时释放已分配的对象

UIViewController *webadressViewController = [[[WebadressViewController alloc] initWithNibName:@"WebadressViewController" bundle:nil] autorelease];
或者,在循环的最后一行添加发布语句(推荐):

如果您有一个像这里一样的紧密循环,那么使用传统的alloc/release模式将更加有效


如果代码保持原样,则内存泄漏。

您正在为每个url创建一个WebAddressViewController,但您没有保留这些视图控制器,以便以后可以释放它们。如果您想这样编码,还需要将WebAddressViewController数组作为属性保留在该代码所属的任何对象中,然后在其dealloc方法中释放它们

但我想知道你为什么要首先创建WebAddressViewController?除了创建视图的代码外,WebAddressViewController类中还有其他代码吗?(如果您现在谈论的是释放控制器,我怀疑不是。)如果以后不需要控制器,为什么不在此时直接创建视图,然后将它们添加为子视图并释放它们?这将使您不必保留大量不需要的视图控制器

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


parentViewController的保留计数为2-alloc init一次,添加到数组两次。如果您不需要自己直接再次访问此控制器(即,如果选项卡式控制器完成了您需要的所有视图管理),则应将其释放一次。

您正在为每个url创建一个WebAddressViewController,但您没有保留这些视图控制器,以便以后可以释放它们。如果您想这样编码,还需要将WebAddressViewController数组作为属性保留在该代码所属的任何对象中,然后在其dealloc方法中释放它们

但我想知道你为什么要首先创建WebAddressViewController?除了创建视图的代码外,WebAddressViewController类中还有其他代码吗?(如果您现在谈论的是释放控制器,我怀疑不是。)如果以后不需要控制器,为什么不在此时直接创建视图,然后将它们添加为子视图并释放它们?这将使您不必保留大量不需要的视图控制器

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


parentViewController的保留计数为2-alloc init一次,添加到数组两次。如果您不需要自己直接再次访问此控制器(即,如果选项卡式控制器执行了您所需的所有视图管理),则应将其释放一次。

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

虽然可能与当前问题无关,但请注意,UINavigationController不支持推送UITabBarController。参见(和答案)。

我两种都试过了,但奈特成功了:-(如果我在循环中释放它,视图就不会出现。这是我的问题。我认为你需要发布更多的代码。你所写的代码有一个内存泄漏。罗杰和我都在说同样的事情。你能在你的笔尖之前、中间和后面写下这些行吗?文件的所有者是否被设置为正确的对象Ty?”