0

コードのこの部分でランダムにクラッシュします。

-(void) goBack {

        [self performSelectorInBackground:@selector(addActivityIndicator) withObject:nil];

        [self.navigationController popViewControllerAnimated:YES];

        }

- (void)addActivityIndicator {
        @autoreleasepool {

            UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];

            UIBarButtonItem * barButton = [[UIBarButtonItem alloc] initWithCustomView:activityView];

            [activityView startAnimating];

            self.navigationItem.leftBarButtonItem = barButton;

        }
    }

これらのメソッドが存在する画面を終了する場合、他のViewControllerがいくつかのデータを処理する必要があります。処理が行われていることをユーザーに通知するために、ナビゲーションバーの左ボタンにアクティビティインジケーターを追加します。

問題は、時々exc_bad_accessinaddActivityIndicatorメソッドを取得することです。頻度は非常にランダムであり、XCodeが最後にエラーを表示することもあれば、@autoreleasepool行にエラーを表示することもありますself.navigationItem.leftBarButtonItem = barButton;

私のviewControllerが破壊されることがあると思いますが、スレッドはまだ実行中であり、もう存在しないオブジェクトのnavigationItemにアクセスしようとします。しかし、それが問題であるかどうかはわかりません。また、それを修正する方法もわかりません。

プロジェクトでARCを使用していますが、この問題は、テストしたすべてのiOSバージョンで発生します。

どうか、誰でも私に何が起こっているのか説明できますか、どうすればこれを修正できますか?

ありがとう。

4

2 に答える 2

8

UIKitをバックグラウンドで実行しないでください。

于 2012-10-03T19:08:50.233 に答える
1

呼び出す[self performSelectorInBackground:@selector(addActivityIndicator) withObject:nil];ことで、バックグラウンドスレッドでUIを更新しています。メインスレッドのUIのみを更新する必要があります。

編集

コメントに基づいて、ビューが表示される前にUIを更新しようとしています。そのための方法は次のとおりです。

[self addActivityIndicator]

[navigationController performSelector:@selector(popViewControllerAnimated:) withObject:[NSNumber numberWithBool:YES] afterDelay:0];

調べることもできますdispatch_after

于 2012-10-03T19:12:15.110 に答える