3

我想知道一些关于我的应用程序的应用程序委托。 为什么我不能发布这样的:窗口addSubview释放问题

-(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; 
} 

我几乎可以肯定,由1 -addSubview方法增加我保留计数。那么当我释放我的控制器时,为什么我会崩溃?为什么它在另一个班级工作,但委托人?

谢谢!

回答

3

其他答案是正确的,UIVIewController没有被保留,我推荐的是设置UIWindows rootViewController(仅适用于iOS 4.0和更高版本)属性,它确实保留了控制器。如果你的应用程序支持pre 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; 
} 
+0

非常感谢。所以在其他情况下,当我打电话推方法我的控制器保留,我可以释放它后? – Pierre

+0

当使用导航控制器推视图控制器时,它会保留视图控制器。 – Joe

0

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

无论如何,如果你不释放它,你将有泄漏。该解决方案是在您的课堂上创建一个ivar并为其分配视图控制器(而不是本地变量),然后将其释放到dealloc

0

当您将视图添加为子视图时,则视图被保留,而不是其控制器。所以当你释放控制器时,它会被释放并且它的视图 - 不是。结果后来的观点试图发送消息到其已经释放的控制器和应用程序崩溃。

0

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

因此,它会被释放,任何进一步的使用它都会让你的应用崩溃。

1

此行

[self.window addSubview:controller.view]; 

增加controller.viewcontroller保留计数。这就是为什么

[controller release]; 

产生了一个问题。

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