UIViewController子视图发布?

时间:2012-12-24 10:18:18

标签: ios uiviewcontroller

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

如果我想发布viewController;

[viewController release];

在发布viewController之前我需要手动发布view1吗?

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];
[viewController release];
我应该这样做吗?或者只是发布viewController?

2 个答案:

答案 0 :(得分:2)

不,你不必这样做。只需发布viewController,它就会在内部释放所有subviews。休息将由框架照顾。

如果您不使用ARC,您的代码将如下所示,

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

[viewController release];

由于您已经同时分配了viewControllerview1,因此必须按照上面的说明释放一次。您不必再次发布,因为此后您没有对此进行任何retain

如果你这样做,

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];

由于您发布了viewController两次并且viewController's子视图也在内部发布,因此发布addSubview时会导致崩溃。

此外,您必须注意的是,view1保留了Apple documentation.

中提到的viewController
  

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

这将在{{1}}发布后发布,您不必手动释放它,因为您不拥有它。

答案 1 :(得分:1)

这是正确的方法。

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

当您将视图添加为子视图时,它将由viewcontroller保留。 addSubview:

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

  

- (void)addSubview:(UIView *)view

     

<强>参数

     

查看

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. 
     

<强>讨论

     

此方法保留视图并将其下一个响应者设置为接收者,   这是它的新超级视图。

     

视图只能有一个超级视图。如果视图已经有超视图和   该视图不是接收者,此方法删除了以前的   在使接收器成为新的超级视图之前的超视图。

参考UIView

  

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

参考:UIViewController Class

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];

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