Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.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
Ios UIViewController子视图发布?_Ios_Uiviewcontroller - Fatal编程技术网

Ios UIViewController子视图发布?

Ios UIViewController子视图发布?,ios,uiviewcontroller,Ios,Uiviewcontroller,如果我想释放viewController UIViewController *viewController = [[UIViewController alloc] init]; UIView *view1 = [[UIView alloc] init]; [viewController.view addSubview:view1]; [view1 release]; 在释放viewController之前是否需要手动释放view1 [viewController release]; 我应该这

如果我想释放viewController

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];
在释放viewController之前是否需要手动释放view1

[viewController release];

我应该这样做吗?或者只需释放viewController?

不,您不必这样做。只要释放
viewController
,它就会在内部释放所有的
子视图。其余部分将由框架负责

[viewController release];
如果不使用ARC,代码将如下所示

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];
[viewController release];
由于您已经分配了
viewController
view1
一次,因此必须按上图所示释放它一次。您不必再进行发布,因为在此之后您不会再进行任何
retain

如果你这样做

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];

[viewController release];
viewController
被释放时,它通常会导致崩溃,因为您要释放它两次,
viewController的子视图也在内部被释放

这里需要注意的一点是,
addSubview
保留了中提到的
view1

要添加的视图。此视图由接收器保留。 添加后,此视图将显示在任何其他子视图的顶部


一旦
viewController
被释放,这将被释放,您不必手动释放它,因为您不拥有它。

这是正确的方法

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];
将视图添加为子视图时,它将由viewcontroller保留。 添加子视图:

将视图添加到接收器的子视图列表的末尾

-(void)addSubview:(UIView*)视图

参数

查看

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];
[viewController release];
讨论

此方法保留视图并将其下一个响应程序设置为接收器, 这是它的新superview

视图只能有一个superview。如果视图已具有superview,则 该视图不是接收器,此方法将删除以前的 将接收器设置为新的superview之前,请查看superview

参考文献

重要提示:视图控制器是其视图和任何视图的唯一所有者 它创建的子视图。它负责创建这些视图和 在适当的时候放弃对它们的所有权,例如 当视图控制器本身被释放时

参考:


当您在viewController上调用release时,它肯定会崩溃。

当视图控制器的视图仍然显示时,您将如何释放视图控制器?
UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];