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在程序的整個生命週期中都處於活動狀態,並且所有內存在終止時都會被清除。