2011-10-28 45 views
1

我們從Xcode中的基於Window的應用程序開始。在`AppDelegate中」我們有內存泄漏,多個UIViewControllers的其他問題

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    MainMenuViewController *mvc = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil]; 
    self.window.rootViewController = mvc; 
    [mvc release]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

MainMenuViewController可以創建其他幾個UIViewController派生類中的一個,這也讓用戶返回到主菜單。在MainMenuViewController,我們有以下幾點:

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil]; 
[self.view.window addSubview:slvc.view]; 
[self.view removeFromSuperview]; 

SecondLevelViewController有類似的代碼回到主菜單。這是有效的,但是最終會在來回多次之後創建兩個類的實例,並且顯然需要以其他方式完成。雖然Instruments不報告任何內存泄漏,但應用程序的總內存使用量將繼續增加,並且視圖控制器的實時分配實例也會不斷增加。

我們認爲調用removeFromSuperview會釋放先前的視圖控制器,但即使文檔說明它應該這樣也不會發生。

我們還注意到,在需要release通話

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil]; 
[self.view.window addSubview:slvc.view]; 
[self.view removeFromSuperview]; 
[slvc release]; // < < < added this line 

但導致SIGABRTunrecognized selector sent to...

A UINavigationViewController對我們來說不太合適,因爲用戶需要能夠返回到主菜單,而不管菜單層次有多深。

回答

1

如果仍然有引用它不是泄漏。嘗試Heapshot,還有在一個偉大的教程:bbum's weblog-o-mat

在:

[self.view.window addSubview:slvc.view]; 
[self.view removeFromSuperview]; 

你只是使用slvc創建slvc.view,爲什麼不創建視圖,因爲不需要視圖控制器。

回覆:UINavigationViewController會爲我們 不太工作你有看:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated 

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated 
+0

我會檢查出Heapshot當我得到機會,謝謝。至於爲什麼一個視圖控制器,我對Apple文檔的理解是視圖控制器處理每個屏幕數據。還有關聯的NIB文件等問題。 – dandan78