2012-01-22 3 views
3

ARCでは時にはクリーンアップを行うために-deallocメソッドを書く必要があります。まれに、クリーンアップを正しく行うためにインスタンスのプロパティを参照する必要があります。 NSNotificationCenterから、指定された送信者オブジェクトを登録解除する(プロパティによって所有されて参照されるなど)。ARCはカスタム-deallocコードの前または後に-deallocにコードを挿入しますか?

ARCは自分自身のコードの終わりにプロパティリリースコードを挿入しますか、それとも自分自身のコードの前に-deallocの先頭に挿入しますか?

ARCがカスタム-deallocコードの前にコードを挿入している場合は、必要に応じてプロパティにアクセスできなくなるため、非常に危険です。

この質問は、ARCが合成-deallocにプロパティリリースコードを挿入する場所で、-deallocを実装するかどうかについては問題ではありません。

+2

私はARCがこれらのケースを検出して処理するのに十分スマートだと思います。 – BoltClock

+0

あなたは「考える」か、それともあなたは知っていますか? –

+0

「dealloc」でプロパティアクセサを使用することは、ARCの前であっても悪い考えでした。イニシャライザで使用するのは悪い考えでした。 iVarsを直接使用してください。 – Abizern

答えて

4

ARCは、デallロックチェーンの最後にインスタンス変数をリリースします。つまり、継承チェーン内のすべてのdeallocメソッドが実行され、のいずれかのARC管理インスタンス変数が割り当て解除されます。あなたは-[NSObject dealloc]で起こっていると考えることができますが、それは実際にはそれよりも後であります。

安心してご利用いただけます。 ARCはあなたの-deallocメソッドであなたの財産をあなたの下から解放しません。 ARCはあなたがそれらをもう参照する方法がなくなるまでそれらを解放しません。

+0

良いと役に立つ答え:-)ありがとうございました!あなたはその知識を得たリソースを指摘できますか?要点は論理的だと思われますが、私は確信しています。確定。 –

+0

私はそれがWWDCセッションの1つで言及されたことを知っていますが、私は正確な参照を見つけることができるかどうかを見ていきます。 –

+0

解散のタイムラインは、WWDC 2011のセッション322-「Objective-C Advancements In Depth」、「オブジェクトの死」と題されたセクションで議論されました。 –

7

私はすべてがここで言われていることを、考える:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.special_methods.dealloc

7.1.2。 dealloc

プログラムにセレクタdeallocのメッセージ送信または@セレクタ式が含まれていると、プログラムが不正です。

理由:deallocを直接呼び出す正当な理由はありません。

クラスは、deallocというインスタンスメソッドのメソッド定義を提供することがあります。このメソッドは、オブジェクトの最終リリース後に呼び出されますが、割り当てが解除されるか、インスタンス変数のいずれかが破棄される前に呼び出されます。スーパークラスのdeallocの実装は、メソッドが戻るときに自動的に呼び出されます。

理由:ARCはインスタンス変数を自動的に破棄しますが、保持できないリソースを解放するなど、deallocメソッドを書く正当な理由はまだあります。このようなメソッドで[super dealloc]を呼び出すことができないことは、ほとんど常にバグです。場合によっては、オブジェクトが単に破壊されることを防ぐことを試みるだけであるが、deallocはオブジェクトがそのような問題を引き起こすのが実際には遅すぎる。多少合法的に、オブジェクトはプールに割り当てられている可能性があり、解放されてはいけません。今のところ、これはARC以外のdealloc実装でのみサポートされます。そのような実装は、NSObjectのdeallocが行う他のすべての作業を行うのに非常に注意する必要があります。これは、この文書の範囲外です。

+2

これは決定的ですが、ユーザーフレンドリーな説明が必要な場合は、[WWDC 2011](* http://developer.apple.com/videos/wwdc/2011/)の*自動参照カウントの紹介*ビデオをご覧ください。 –

+0

これは私の質問にはまったく答えていません。私はこの文書を自分で読んだ。これは、ARCが-deallocの最後または最初にインスタンス変数をリリースするかどうかを伝えるものではありません。 ARCは単にdeallocを合成しますが、それを自分で実装する場合、ARCはそのコードをどこかに挿入する必要があります。問題は* *どこかです。 –

+0

みんな、なぜ間違った答えを投票し続けますか?非常に役立ちます。 –

関連する問題