2012-04-30 18 views
1

スタック内の以前のビューコントローラを削除する必要があります。リリース構成でUINavigationControllerがクラッシュするのはなぜですか?

NSMutableArray *vcs = [NSMutableArray arrayWithArray:self.navigationController.viewControllers]; 
    BOOL removedFlag = YES; 
    while (removedFlag == YES) 
    { 
     removedFlag = NO; 
     for (UIViewController *vc in vcs) 
     { 
      if(![vc isKindOfClass:[self class]] && ![vc isKindOfClass:[MenuVC class]]) 
      { 
       [vcs removeObject:vc]; 
       removedFlag = YES; 
       break; 
      } 
     } 
    } 
    [self.navigationController setViewControllers:[NSArray arrayWithArray:vcs]]; 

は今、私はアプリを更新していますし、それが神秘的にリリース構成ではなく、デバッグ時にクラッシュ:私は正常に何の問題もなく、過去にこの方法を使用しています。さらに、デバッグモードでは何の警告もありません。私はSDKで何か変わったと思う。これは決して前にこれをしなかった。 http://dl.dropbox.com/u/7834263/RemoveTest.zip

これはARC対応のプロジェクトです:

私は、利用可能なサンプルプロジェクトを作りました。

答えて

1

最初の行は、実際にすべきである:

NSMutableArray *vcs = [self.navigationController.viewControllers mutableCopy]; 

NSMutableArrayのはにNSArrayのサブクラスです。 arrayWithArrayはNSArrayクラスのメソッドであり、不変の配列を作成します。 mutableCopyメソッドは元の配列の可変コピーを作成します。あなたは実際にはNSMutableArrayではなかったので、あなたは本当にあなたのvcs配列のremoveObjectを呼び出すことはできませんでした。NSArrayだったからです。

+0

これは動作しますが、なぜですか?どちらの配列もオブジェクトへの参照を保持していませんか? – TigerCoding

+0

解説を解説付きで更新しました。 –

+0

=奇妙な私は以前これに問題がなかった。上記のコードで、削除後にvcs配列の内容をチェックすると、2つのView Controllerしか表示されないので、それらを削除しています。 – TigerCoding

0

スタックに以前のViewControllerを削除する簡単な方法は次のようになります。

int vcIdx=[self.navigationController.viewControllers indexOfObject:self]-1; 
NSMutableArray *vControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[vControllers removeObjectAtIndex:vcIdx]; 
self.navigationController.viewControllers=vControllers; 
+0

私は実際に私のプロジェクトで複数のコントローラを削除していますが、それを指定しませんでした。はい、これはよかったです。 – TigerCoding

+0

ああ、私はあなたの要件が以前のコントローラを削除することだと思った:) – Mat

関連する問題