我們從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
但導致SIGABRT
和unrecognized selector sent to...
。
A UINavigationViewController
對我們來說不太合適,因爲用戶需要能夠返回到主菜單,而不管菜單層次有多深。
我會檢查出Heapshot當我得到機會,謝謝。至於爲什麼一個視圖控制器,我對Apple文檔的理解是視圖控制器處理每個屏幕數據。還有關聯的NIB文件等問題。 – dandan78