2012-02-10 19 views
0

ここでは、UIViewControllerを削除して、アプリケーションで再び使用することはありません。スタックからUIViewControllerを永久に削除する

NSMutableArray *allViewControllers = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; 
    [allViewControllers removeObjectAtIndex:0]; 
    [allViewControllers removeObjectAtIndex:1]; 
  1. これはスタックからビューを削除する正しい方法ですか?

  2. 私が上記のコードが実行されるステージに入ると、メモリが解放されないことがインストルメントでアプリを実行していることがわかります。ここで何が間違っていますか?

+0

ARCを使用しているかどうかを確認しますか? –

+0

私はARC機能を使用しています。 – OhDoh

+1

正しいインデックスを削除していますか?これにより、最初の削除後の並べ替えを考慮せずに、実際には0と2が削除されます。 – willcodejavaforfood

答えて

0

ビューコントローラを新しい可変配列に割り当てると、保持カウントが1増加し、保持カウントが削除されると保持カウントが1減少し、ネットエフェクトはゼロになります。あなたがしたいのは、ナビゲーションコントローラーの一部であるビューコントローラーを取り除いた後に置き換えることです。そこでは、ナビゲーションコントローラーが古いインスタンスを解放するようにします。

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

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

いいえ、効果はありません。メモリヒープのサイズは、あなたが提案するコードの有無にかかわらず同じです。 – OhDoh

+0

あなたがあなたのnavigationControllerにviewControllerをプッシュするときに、それらをリリースしたかオートレリースしたことを確認しましたか? UIViewController *コントローラ= [[UIViewController alloc] initMethodUsed]; [navigationController pushViewController:コントローラアニメーション:はい]; [コントローラのリリース]; –

0

あなたは実際にviewControllerを解放していません。保持カウントを+1だけ増加させてから-1だけ減少させています。

実際には、あなたのviewControllerを解放するために書いたコードの影響を受けることはありません。

NavigationControllerでは、popToRootViewControllerを呼び出して、NavigationControllerのベース/ルートビューコントローラー以外のすべてのビューコントローラーを解放します。

+0

さて、私はすべてのビューを削除する必要はありません。特定のもののみ。どうやってするか ? – OhDoh

3

新しいNSMutableArrayviewControllersに作成してから新しいNSMutableArrayを削除すると、何も実行されません。 viewControllersは依然としてnavigationControllerによって保持されています。

+0

どのように特定のものを削除するには? – OhDoh

+0

いくつかのメソッドの1つ、 'popToRootViewControllerAnimated'、 'popToViewController'または 'popViewControllerAnimated'を使って、 'navigationController'を' navigationController'から削除してください。 @Joelの答えも見てください。 – zaph

関連する問題