1
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?

4

2 回答 2

2

不,你不必那样做。只需发布viewController,它将在subviews内部发布所有内容。其余的将由框架处理。

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

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

[viewController release];

由于您已经分配了viewController一次view1,因此您必须释放一次,如上所示。你不必再次发布,因为在那之后你没有做任何retain事情。

如果你这样做,

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

它主要会在发布时导致崩溃,viewController因为您要发布它两次,并且viewController's子视图也在内部发布。

在这里,您必须注意的是,addSubview保留view1Apple 文档中所述。

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

这将在发布后viewController发布,您不必手动发布它,因为您不拥有它。

于 2012-12-24T10:21:34.917 回答
1

这是正确的方法。

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

当您将视图添加为子视图时,视图控制器将保留它。添加子视图:

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

- (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 类

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

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

于 2012-12-24T10:26:17.353 回答