0

アプリの作業中に興味深い問題に遭遇しました。シーンを想像してみてください

  • 1 つのオブジェクトが存在します。それを A と呼びましょう。
  • A、次に、委任ベースのクラス、たとえば NSURLConnection のオブジェクト (B) を作成します。
  • A が B のデリゲートとして割り当てられた場合、A は必要なすべてのデリゲート メソッドを実装している必要があります。
  • A は B に処理の開始を要求します。この例では、サーバーからデータを取得しています。
  • B がデータのフェッチを完了するとすぐに、A の指定されたメソッドを呼び出します。

最後のステップで、A のメソッドを呼び出しているときに、B が A オブジェクトがもう存在しないことに気付いたとします。するとどうなる???

よくわかりませんが、クラッシュの原因になりますか?

はいの場合、状況を回避する方法を教えてください。

私の場合、viewcontroller を何らかのオブジェクトのデリゲートとして割り当てました。たとえば、viewDidLoadメソッド内の X です。Xがviewcontrollerで定義されたデリゲートメソッドを呼び出す前に、viewcontrollerが破棄される場合があります。

  • X のデリゲートを nil に割り当てると問題が解決する場合。じゃあどこにしようかな。

要するに、どのメソッドがビュー コントローラのアンロード フェーズ中に 1 回だけ呼び出さ viewDidLoadれ、ロード フェーズでも同じように呼び出されます。

4

3 に答える 3

1

クラス間(クラスAはいつでも割り当てを解除できる)でこの種の通信を実現するための最良の方法は、を聞くことNSNotificationsです。
あなたが述べたように、weak(assign)デリゲートを使用することは危険であり、特別な考慮が必要です。強力な
デリゲート を使用すると、メモリが肥大化する可能性もあります(とにかく、ビューコントローラーをビューからポップした後も長い間ビューコントローラーを保持する必要があるのはなぜですか?)。

NSNotificationCenterと通知の詳細については、SDKドキュメントで多くの情報を見つけることができます。特定の質問については、どこに質問すればよいかがわかります。

于 2012-10-18T13:03:27.510 に答える
1

あるオブジェクトが別のオブジェクトへの参照を保持している状況に到達してはなりません。この参照は、所有者オブジェクトに通知されずに別の場所で解放される可能性があります。

オブジェクトA通知オブジェクトの割り当てを解除するときB(たとえば、オブジェクト B のメンバーa nillを作成することによって)、またはデザイン/フローを変更して、終了A前に割り当てを解除できないようにしますB(たとえば、可能であればAデリゲートとして割り当てるときに保持します)。B

于 2012-10-18T12:15:47.720 に答える
0

有効なデリゲート オブジェクトをチェックするだけで十分です。

if (delegate)
   [delegate method];
于 2012-10-18T12:03:35.257 に答える