2012-12-24 51 views
1
UIViewController *viewController = [[UIViewController alloc] init]; 
UIView *view1 = [[UIView alloc] init]; 
[viewController.view addSubview:view1]; 
[view1 release]; 

如果我想释放viewController;UIViewController子视图发布?

[viewController release]; 

,我需要释放的viewController之前手动释放厂景?

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

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

回答

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保留view1Apple documentation.

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

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

1

这是正确的方法。

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

当您将视图添加为子视图时,视图控制器将保留该视图。 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. 

讨论

这会见hod保留视图并将其下一个响应者设置为接收者 ,这是其新的超级视图。

视图只能有一个超级视图。如果视图已经有超级视图并且该视图不是接收者,则在使接收者成为新的超级视图之前,该方法移除先前的超级视图。

参考UIView

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

参考:UIViewController Class

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

它一定会崩溃的时候你在viewController上调用release。

+1

如何在视图控制器仍然显示时释放视图控制器? – sergio

相关问题