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?
答案 0 :(得分: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
时会导致崩溃。
此外,您必须注意的是,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
重要提示:视图控制器是其视图的唯一所有者 它创建的子视图。它负责创建这些视图和 在适当的时候放弃对它们的所有权 当视图控制器本身被释放时
UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];
当你在viewController上调用release时,肯定会崩溃。