1

UIWebViewのサブクラスであるビューがあります。管理オブジェクトであるContactというプロパティがあります。ビューはテンプレート エンジンを使用して、オブジェクトを含む html を作成し、UIWebViewに読み込みます。オブジェクトで何かが変更されるたびにビューが自動的に更新されるように、ビュー自体でオブジェクトを監視することをお勧めします。そのため、ビュー自体で管理対象オブジェクトの特定の属性を観察しました。そして、通知の合体を避けるために、リロードが次のように行われるようにしました

[self performSelector:@selector(refresh) afterDelay:0 ].

変更が見つかるたびに Web ビューを自動的に更新しますが、奇妙なクラッシュも発生します。クラッシュは、割り当て解除されたオブジェクトに送信された [MyWebView 保持] メッセージを示しています。dealloc メソッドで観測値を適切に削除したことはわかっています。しかし、しばらくすると dealloc がトリガーされるようです。ビューの解放に関連する奇妙な問題があります。ビュー コントローラは既に解放されており、その後 2/3 秒後に解放されますが、ビューはしばらくそのままになります。本当に奇妙です。クラッシュはこれが原因だと思います。

何かアイデアを提案してください。ご提案をお待ちしております。確かに何か問題があります。誰かが私を指摘してくれれば、本当に感謝しています。

4

1 に答える 1

0

デリゲート デザイン パターンを使用すると、適切に使用しないと EXC_BAD_ACESS KERN_INVALID_ADDRESS がクラッシュする可能性があります。デリゲート デザイン パターンを使用するバックグラウンド スレッドで実行されている処理がある場合、オブジェクトでデリゲートとして SELF を設定すると、デリゲート参照をnil、またはオブジェクトがデリゲート デザイン パターンを使用して割り当て解除されたオブジェクトにコールバックしようとする可能性があります。したがって、オブジェクトにこのようなものがある場合。

[_xmlParser setDelegate:self];

作業中にオブジェクトが破壊された場合にクラッシュする可能性を防ぐために、ARC の下でも常に dealloc メソッドを用意する必要があります。作業中にオブジェクトが破壊されることは非常に一般的です。インターネットからの画像を表示する UIViewController を想像してみてください。デリゲート デザイン パターンを使用してイメージをルックアップし、ルックアップが終了したときにオブジェクトのルーチンを呼び出す FetchImage クラスがある場合、FetchImage オブジェクトがまだ作業を行っている間に、ユーザーが UIViewController に簡単に出入りできます。バックグラウンド スレッドで。テスト時にはこれに気付かないかもしれませんが、何百人ものユーザーがいる場合、オブジェクトが SELF 参照でメソッドを呼び出そうとするとアプリがクラッシュするため、一部のユーザーは気付くでしょう。

オブジェクトがデリゲート デザイン パターンを使用している場合は、常にこれをクリーンアップする必要があります。

#pragma mark - dealloc - cleanup delegate references to prevent callbacks into deallocated objects (EXC_BAD_ACCESS / KERN_INVALID_ADDRESS)

- (void)dealloc
{
    [_xmlParser setDelegate:nil];
    // for non ARC based code you would also call: [super dealloc]; 
}

プロジェクト内のすべてのクラスを検索します。setDelegate:self または delegate = self を使用している場合、上記のように dealloc クリーンアップ メソッドを使用していないと、ユーザーがアプリで競合状態のクラッシュを経験する可能性が高くなります。テスト時にクラッシュが見られなくても、dealloc がない場合は追加してください。-r

于 2014-01-09T20:28:54.760 に答える