window addSubview发布问题

时间:2011-07-21 18:11:43

标签: objective-c ios uiapplicationdelegate addsubview retaincount

我想知道我的应用程序的app代理。 为什么我不能这样发布:

-(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我的保留计数。那么当我释放控制器时为什么会崩溃呢?为什么它在另一个班级而不是代表?

谢谢!

5 个答案:

答案 0 :(得分:3)

其他答案是正确的,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;
}

答案 1 :(得分:1)

这一行

[self.window addSubview:controller.view];

增加controller.view controller的保留次数。这就是为什么

[controller release];

会产生问题。

如果这是主窗口,那么您不必担心内存泄漏,因为window在程序的整个生命周期内都处于活动状态,并且所有内存在终止时都会被清除。 / p>

答案 2 :(得分:0)

addSubView会增加视图控制器内部视图的保留计数,这就是为什么在释放控制器时应用程序崩溃的原因。

在任何情况下,如果你不释放它,你将有泄漏。解决方案是在您的类中创建一个ivar并为其分配视图控制器(而不是局部变量),然后在dealloc中释放它。

答案 3 :(得分:0)

当您将视图添加为子视图时,会保留视图,而不是其控制器。因此,当您释放控制器时,它会被取消分配并且其视图 - 而不是。结果后来视图尝试将消息发送到已经解除分配的控制器和应用程序崩溃。

答案 4 :(得分:0)

这是因为您是该控制器的唯一所有者。您只需将其视图添加为窗口的子视图。虽然窗口的视图保留了视图,但控制器没有。

因此,它将被取消分配,任何进一步使用它都会使您的应用程序崩溃。