iOSプロジェクト用のダウンローダーを実装しました。リクエストを受け入れ、ダウンロードが完了すると、デリゲートによってターゲットに応答します。これは非同期であり、ターゲットは(明らかに)弱い参照であるため、ダウンロードが完了したときに、ターゲットが割り当てられなくなった場合、bad_accesが発生します。すべてのリクエストでターゲットを検索し、それをnilに設定するメソッド(それを使用するオブジェクトの割り当てが解除されたときに呼び出される)を追加することを解決しました。これは私が望んでいた動作とはかけ離れています(他のオブジェクトから完全に独立しています:ダウンロードが要求されなくなった場合はキャッシュされます:ダウンロードを停止する方法はありませんが、優先キューのみです)かどうかを知る安全な方法がありますポインタはまだ有効なメモリアドレスを指していますか?
3 に答える
あなたの質問に答えて、ポインタがまだ有効であることを知る良い方法はありません(ゾンビは本番環境のソリューションではなく、単なるテスト環境のツールです)。しかし、「これがダングリングポインターであるかどうかをどうやって知るのか」を心配するのではなく、そもそもダングリングポインターの発生を許可しないようにする必要があります。
ダウンローダーが作成されたときに、おそらくデリゲートを指定しました。デリゲートであるオブジェクトが消えるとき(たとえば、その中でdealloc
)、ダウンローダーにデリゲートプロパティをに設定するように指示する必要がありnil
ます。これにより、ダングリングポインターが排除されます。
コードのプロファイルを作成します。特にメモリリークをチェックする機器を使用してください。また、Analyzeを使用して、潜在的に問題のある部分を検出します。さまざまなツールを使用すると、開発に大いに役立ちます。
ポインタが指しているメモリ内の場所を見るだけでは、(独自のメモリマネージャを作成せずに)有効なメモリを指しているかどうかを安全に知る方法はありません。
コード内のデリゲートを保持/解放してみませんか?これは、これを設計するための適切な方法です。また、コードのユーザーがデリゲートのリストから自分自身を削除するためのメソッドを提供します。