window addSubview 发布问题
Posted
技术标签:
【中文标题】window addSubview 发布问题【英文标题】:window addSubview release problem 【发布时间】:2011-07-21 18:11:42 【问题描述】:我想知道有关我的应用程序的应用程序委托的一些事情。 为什么我不能这样释放:
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
RootViewController *controller = [[RootViewController alloc]
initWithNibName:@"RootViewController"
bundle:[NSBundle mainBundle]];
[self.window addSubview:controller.view];
[controller release]; // Here's my question
[self.window makeKeyAndVisible];
return YES;
我几乎可以肯定 -addSubview
方法将我的保留计数增加 1。那么为什么我释放控制器时会崩溃?为什么它在另一个类而不是委托中工作?
谢谢!
【问题讨论】:
【参考方案1】:其他答案是正确的,UIVIewController 没有被保留,我建议设置 UIWindow
s rootViewController(仅适用于 ios 4.0 及更高版本)属性,它确实保留了控制器。如果您的应用支持 iOS 4.0 之前的版本,那么您需要将控制器存储在实例变量中。
-(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
RootViewController *controller = [[RootViewController alloc]
initWithNibName:@"RootViewController"
bundle:[NSBundle mainBundle]];
//controller will be retained and view will set for you
window.rootViewController = controller;
[controller release];
[self.window makeKeyAndVisible];
return YES;
【讨论】:
非常感谢。所以在其他情况下,当我调用 push 方法时,我的控制器被保留,我可以在之后释放它? 是的,当使用导航控制器推送视图控制器时,它会为您保留视图控制器。【参考方案2】:这一行
[self.window addSubview:controller.view];
增加controller.view
的保留计数不 controller
。这就是为什么
[controller release];
造成问题。
如果这是主窗口,则无需担心内存泄漏,因为window
在程序的整个生命周期内都处于活动状态,并且在终止时会清除所有内存。
【讨论】:
【参考方案3】:addSubView
增加了视图控制器内部视图的保留计数,这就是如果您释放控制器,应用程序会崩溃的原因。
无论如何,如果你不释放它,你就会有泄漏。解决方案是在您的类中创建一个 ivar 并为其分配视图控制器(而不是局部变量),然后在 dealloc
中释放它。
【讨论】:
【参考方案4】:当您将视图添加为子视图时,视图 将被保留,而不是其控制器。因此,当您释放控制器时,它会被释放并且它的视图 - 不是。结果,稍后视图尝试将消息发送到其已释放的控制器和应用程序崩溃。
【讨论】:
【参考方案5】:这是因为您是该控制器的唯一所有者。您只需将其视图添加为窗口的子视图。尽管视图被窗口的视图保留,但控制器不会。
因此,它将被解除分配,任何进一步使用它都会导致您的应用崩溃。
【讨论】:
以上是关于window addSubview 发布问题的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C中的rootViewController和addSubview?