0

私はこの問題を解決しましたが。なぜそれが機能したのかを説明してくれる人が本当に必要です。

表示されるViewControllerとしてUINavBarカスタムを持つを持っています。UIViewナビゲーションバーのタイトルビューの代わりにカスタムボタンを作成し、次のように設定しましたautorelease(既存の非ARCコードをカスタマイズしています):

- (void)loadView {
    ..  

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self
               action:@selector(presentEmailThreadList)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:[NSString stringWithFormat:@"1 of %d",self.numThreads] forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);

    self.navigationItem.titleView = [button autorelease];
}

このコードは、ビューをモーダルに表示するときに機能します。

[self presentModalViewController:emailThreadListVC animated:YES];

しかし、EXC_BAD_ACCESSそれをナビゲーションスタックにプッシュしようとするとエラーが発生し、新しいVCの[戻る]ボタンをクリックします。

[self.navigationController pushViewController:emailThreadListVC animated:YES];

特に:でクラッシュしUINavigationItemTitleViewます

ここに画像の説明を入力してください

titleView元のVCに戻ろうとすると、はもう存在しないと結論付けました。つまり、スタック上にVCをプッシュすると、autorelease参照カウントがデクリメントされましたが、私がtitleViewVCをモーダルにプッシュします。

なぜですか?

4

1 に答える 1

1

問題はここにあります:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
...
self.navigationItem.titleView = [button autorelease];  <-- DOUBLE AUTORELEASE

buttonWithTypeはすでに自動解放されたオブジェクトを返しているため、再度明示的に自動解放する必要はありません。

使用時になぜ機能するのかpresentViewControllerは別の問題です。2つのケースでは、タイミングが異なることに帰着すると思います。

于 2013-01-14T11:05:28.147 に答える