0

TestFlight でクラッシュ レポートを調べていますが、最も頻繁に発生するクラッシュは次のとおりです。

オブザーバーとして登録されていないため、「ListArchiver 0x1d5b83b0」からキー パス「batchImageDownloadingInProgress」のオブザーバー「ListViewController 0x1d590500」を削除できません。

ListViewController

- (void)viewWillAppear:(BOOL)animated
{
    ...

    [[WanderlistArchiver sharedArchiver] addObserver:self forKeyPath:@"batchImageDownloadingInProgress" options:NSKeyValueObservingOptionNew context:nil];
}

// **** the error happens in here ****
- (void)viewWillDisappear:(BOOL)animated
{
    ...

    [[WanderlistArchiver sharedArchiver] removeObserver:self forKeyPath:@"batchImageDownloadingInProgress"];
}

オブザーバーをセットアップした場合viewWillAppear(コード内の他の場所には触れないでください)、viewWillDisappear実行時にまだ登録されないのはなぜですか? これは過去 90 日間で 5 回しか発生していませんが、なぜこれが発生したのかを理解したいと思います。

4

2 に答える 2

1

ほとんどの問題は、viewWillDisappear:への呼び出しごとに複数回呼び出されていることviewWillAppear:です。これはまれにしか発生していないように見えるため、これが発生する原因となる一連の奇妙なイベントがあるに違いありません。

問題を再現できない場合に考えられる回避策の 1 つは、BOOLivar を追加することです。viewWillAppear:オブザーバーを追加するときは、YES に設定します。でviewDidAppear:、設定されているかどうかを確認します。設定されている場合は、NO に設定してオブザーバーを削除します。設定されていない場合は、オブザーバーを削除しないことがわかります。

于 2013-01-16T18:15:42.217 に答える
1

contextが同じであることを確認する必要があります。remove ステートメントで、コンテキストを使用しないメソッドを使用しています。代わりにコンテキスト変数を使用しnil、それが add ステートメントと remove ステートメントで同じであることを確認してください。

詳細な説明については、この質問を参照してください。

于 2013-01-16T18:16:20.743 に答える