2012-02-10 48 views
0

下面是我如何移除永遠不會在應用程序中再次使用的UIViewControllers。從堆棧中永久移除UIViewController

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; 
    [allViewControllers removeObjectAtIndex:0]; 
    [allViewControllers removeObjectAtIndex:1]; 
  1. 這是從堆棧中刪除視圖的正確方法?

  2. 使用Instruments運行應用程序時,我注意到應用程序進入執行上述代碼的階段時,內存不會被釋放。這裏有什麼問題?

+0

您是否在使用ARC? – 2012-02-10 14:54:58

+0

我正在使用ARC功能。 – OhDoh 2012-02-10 14:59:11

+1

你是否刪除了正確的索引?這實際上會刪除0和2,而不考慮第一次刪除後的重新排序。 – willcodejavaforfood 2012-02-10 14:59:47

回答

0

通過將您的視圖控制器分配到一個新的可變數組中,您將其保留計數增加1,刪除它們將其保留計數減1,以使淨效應爲零。你想要做的是在刪除它們之後替換屬於導航控制器的視圖控制器,通過導航控制器釋放你的舊實例。

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
[allViewControllers removeObjectAtIndex:0]; 
[allViewControllers removeObjectAtIndex:1]; 

[self.navigationController setViewControllers:allViewControllers animated:YES]; 
+0

不,沒有效果。內存堆的大小與使用或不使用您建議的代碼相同。 – OhDoh 2012-02-10 15:24:38

+0

您確定何時將viewController推送到您發佈或自動釋放它們的navigationController? UIViewController * controller = [[UIViewController alloc] initMethodUsed]; [navigationController pushViewController:controller animated:YES]; [控制器發佈]; – 2012-02-10 15:44:22

0

你實際上並沒有釋放viewControllers。你只需增加+1,然後減少-1。

實際上沒有任何東西會受到您編寫的用於釋放viewControllers的代碼的影響。

對於NavigationController,您可以調用popToRootViewController以釋放除NavigationController的基本/根視圖控制器以外的所有其他視圖控制器。

+0

那麼,我不想刪除釋放所有視圖。只有特定的一個。怎麼做 ? – OhDoh 2012-02-10 15:04:57

3

創建一個新的NSMutableArrayviewControllers,然後從新的NSMutableArray刪除完成任何事情。 viewControllers仍由navigationController保留。

+0

如何刪除特定的一個呢? – OhDoh 2012-02-10 15:07:25

+0

使用以下幾種方法之一從'navigationController'刪除'viewControllers':'popToRootViewControllerAnimated','popToViewController'或'popViewControllerAnimated'。另請參閱@Joel的答案。 – zaph 2012-02-10 15:20:31