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 没有被保留,我建议设置 UIWindows 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 发布问题的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch addsubview 动画

Objective-C中的rootViewController和addSubview?

AddSubview 和 PresentModal 问题

self.view.addSubview 和 view.addSubview 的区别

不能“addSubView”

viewWithTag 和 addSubview