2009-06-23 77 views
3

什麼是重用UIViewControllers的最佳實踐?在許多應用程序(包括Apple自己的例子,例如SQLiteBooks)中,UIViewController每次都被分配和初始化,UIViewController被推送到堆棧。這增加了每個新控制器對內存的使用,因爲對象會留在內存中而不會再次使用。iPhone:重用UIViewControllers以節省內存

如何讓它變得更好?

回答

1

這是創建一個新的視圖控制器和內存時,當畫面從窗口中刪除被釋放我做什麼

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease]; 
[[self navigationController] pushViewController:mvc animated:YES]; 
1

您是否確實遇到過內存問題,請嘗試解決或者這是premature optimization的情況?我會說,除非有特定的資源問題,否則最好的做法是遵循標準視圖控制器模式。

+0

這還不是一個內存問題。但是我看到儀器中的內存字節計數器快速增長。我開發了一個應用程序,它大量使用UIControllerViews。所以我試圖防止內存問題。 – Stefan 2009-06-23 10:49:01

4

這增加 每一個新的控制器使用的內存,因爲 對象停留在內存中,而不是 再使用。

只要你沒有別的東西堅持下去,它應該在堆棧彈出時被釋放。檢查你的dealloc方法正在被調用。

此外,如果將它推入堆棧,則至少要保持它在彈出狀態(如果遵循標準模式,則會自動發生)。所以它再次使用。

因此,下面的標準模式應該已經保持你的內存使用量儘可能小,你可以逃避。

1

把你的視圖控制器的dealloc函數中設置斷點,並確保它被稱爲當你從窗口中刪除視圖控制器。記憶不應該繼續建立。如果您正在正確創建和自動釋放您的控制器(如上面的LostInTransit所示),則每個控制器的內存在被移除時應該被釋放。

如果你看到dealloc沒有被調用,這意味着應用程序中的某個位置仍然存在對視圖控制器的引用。

1

不要忘記,視圖控制器不是你的看法。

視圖控制器持有的視圖可以卸載,因此視圖控制器本身非常輕便。如果你想保持足跡真的很輕,你可以取消控制器在viewDidUnload中分配的任何其他數據(當存在內存警告時,通常會調用它 - 但它只有3.0版本)。

正如大家所指出的,視圖控制器在你離開它們時會被釋放(回擊),所以通常不會有任何懸掛的東西。但是,如果我想在用戶離開它的相同狀態(在應用程序啓動之間不起作用)下重新打開該視圖,有時候我會發現它很方便。