6

を使用して遅延スレッドを起動しましたperformSelectorが、ユーザーは現在のビューで戻るボタンを押すことができ、deallocが呼び出されます。これが発生しても、スレッドが呼び出されているように見えます。これにより、スレッドが書き込もうとしているプロパティが解放されたため、アプリがクラッシュします。これを解決するためにcancelPreviousPerformRequestsWithTarget、前のリクエストをキャンセルするために電話をかけようとしていますが、機能していないようです。以下は、いくつかのコードスニペットです。

- (void) viewDidLoad {
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void)viewWillDisappear:(BOOL)animated {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
    }

私はここで何か間違ったことをしていますか?このメソッドmyStopUpdatingLocationは、performリクエストを呼び出しているのと同じクラスで定義されています。

もう少し背景。私が実装しようとしている機能は、ユーザーの場所を見つけ、その場所の周りのいくつかの場所をグーグルで検索し、地図上にいくつかの注釈を表示することです。で場所の更新viewDidLoadを開始しCLLocationManagerます。タイムアウト内に希望の精度が得られない場合は、6秒後にタイムアウトを組み込み、これを行うためにを使用しperformSelectorています。ユーザーがビューの[戻る]ボタンをクリックすると、すべてのプロパティが解放されてもこのスレッドが実行され、クラッシュが発生する可能性があります。

前もって感謝します!

ジェームズ

4

2 に答える 2

4

問題が見つかりました。performSelectorの呼び出しとは何の関係もありませんでした。MKMapViewとCLlocationManagerのデリゲートを解放する前にnilに設定する必要があることがわかりました。そうしないと、インスタンスをリリースしたとしても機能し続け、アプリがクラッシュする可能性があります。

助けてくれてありがとうノア!

于 2010-05-19T07:13:11.650 に答える
2

異なるオブジェクトで複数のperformSelector呼び出しをスケジュールしていることに気づかなかったため、それぞれの場合で「自己」が異なるという同様の問題が発生しました。

NSLog(@ "Self:%@"、self);をスローすることをお勧めします。次のようなコードの各ビットの前に:

- (void) viewDidLoad {
    NSLog(@"Self: %@",self); before
    [self performSelector:@selector(myStopUpdatingLocation) withObject:nil afterDelay:6];
}   

- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"Self: %@",self); before
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myStopUpdatingLocation) object:nil];
}

これにより、SELFインスタンスを比較して、同じオブジェクトでセレクターを実行および解放していることを確認できます。

于 2011-05-03T23:35:48.697 に答える