3

我想知道我的应用程序的应用程序委托。为什么我不能这样释放:

-(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。那么为什么我释放控制器时会崩溃?为什么它在另一个班级工作,但代表?

谢谢 !

4

5 回答 5

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;
}
于 2011-07-21T18:27:11.447 回答
1

这条线

[self.window addSubview:controller.view];

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

[controller release];

造成问题。

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

于 2011-07-21T18:17:17.823 回答
0

addSubView增加视图控制器内部视图的保留计数,这就是如果您释放控制器应用程序崩溃的原因。

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

于 2011-07-21T18:14:30.117 回答
0

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

于 2011-07-21T18:15:44.843 回答
0

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

因此,它将被释放,任何进一步使用它都会使您的应用程序崩溃。

于 2011-07-21T18:16:10.570 回答