【问题标题】:window addSubview release problemwindow addSubview 发布问题
【发布时间】: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。那么为什么我释放控制器时会崩溃?为什么它在另一个类而不是委托中工作?

谢谢!

【问题讨论】:

    标签: objective-c ios uiapplicationdelegate addsubview retaincount


    【解决方案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】:

          这是因为您是该控制器的唯一所有者。您只需将其视图添加为窗口的子视图。尽管视图被窗口的视图保留,但控制器不会。

          因此,它将被解除分配,任何进一步使用它都会导致您的应用崩溃。

          【讨论】:

            猜你喜欢
            • 2011-07-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-05
            • 1970-01-01
            • 2010-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多