2010-03-03 92 views
1

有些東西令我困惑,在通過我的應用程序和樂器之後,它是一個基於UINavigationBased的應用程序,它注意到了這一點。UINavigationController策略(iPhone)

一個的tableView細胞被竊聽,我這樣做每次:

 GenericTableViewController *someViewController = [[Generic TableViewController alloc] init];  
     [self.navigationController pushViewController:someViewController animated:YES]; 
     [someViewController release]; 

我然後點擊返回按鈕,並期待在儀器,看看有多少生活的GenericTableViewController的情況存在。後面的水龍頭有1個,之後有0個。 這是非常好的,由UINavigationController進行清理內存管理。

但是,在應用程序中的其他地方我不使用後退按鈕來留下視圖,在某些viewControllers中點擊我的一個自定義按鈕將完全像上面那樣運行代碼,但viewController在其中點擊自定義按鈕,不會被釋放。

我想我明白了爲什麼,navigationController會做出判斷調用,我可能會推動某些東西進入堆棧,並且稍後會返回,所以它會將控制器保留在內存中。這意味着點擊後退按鈕使用[self.navigationController popViewController]。好。

現在的問題是,我每次訪問的視圖都沒有在導航欄中使用「後退」按鈕時, 將不會被釋放。每次訪問視圖時,樂器中的計數分配都會增加,直到我有20個物體存在爲止。

我試着將[self.navigationController popViewController]放在我的自定義按鈕的選擇器中。這意味着在推入新的堆棧之前,我手動彈出可見的viewController。 但分配計數不下降?猜猜「後退」按鈕並沒有使用這個技術畢竟...

我也試過使用popToViewController,因爲我總是知道如果控制器已經在堆棧上或沒有。但要使用popToViewController,我需要爲視圖保留一個參考。

是否有對UINavigationController的說法:如果此viewController在您的堆棧上,請顯示它,如果沒有請實例化它,推入堆棧並顯示它。

這裏的挑戰可能並非我在NavigationController中的所有導航都是完全線性的。我有時必須從堆棧項目號去。 2堆疊物品編號。 5,回到3等

所以有辦法做到這一點,同時仍然有UINavigationController確保釋放我的viewControllers,而不是多次實例化相同的viewController?

回答

3

你可以嘗試訪問UINavigationControllerviewControllers屬性來獲取所有的視圖控制器目前的導航堆棧的NSArray。然後使用containsObject:來檢查視圖控制器是否已經在堆棧上。
如果是,則使用popToViewController:animated:來顯示視圖控制器。如果它不在堆棧上,請使用pushViewController:animated:。 如果這對你沒有幫助,也許setViewControllers:animated:是正確的方法。

+0

嗨ChrisB 我沒有考慮使用viewcontrollers數組來手動測試我的對象是否在堆棧上。正確實施我應該能夠做這個測試儘可能少的時間。謝謝 – RickiG 2010-03-05 12:49:00