2013-02-19 9 views
6

私は__weak id bar ivarを含む@class Fooを持っています。異なるクラスのメソッドからのいくつかのアクションは、オブジェクトを消滅させ、barを取得することがあります。__weak ivarがニールされているときにアクションを実行したい

ARCによってivarが自動的にnailされたときにアクションを実行します。

可能であれば、barを不動産にするか、Key-Value Observingを使用しないでください。

これも可能ですか?そうでない場合は、KVOは非象牙象牙に対して使用できますか?

+0

慣習では、名前を__weak id barにする必要があります。どのクラスがこの変数であるか知っていますか? deallocメソッドでこれを処理できます。 –

+0

Ramy:ええ、私のせいで、私はその問題(実際の名前は小文字で始まった)で修正しました。 'dealloc'に関しては、可能であれば' bar'の 'dealloc'メソッドの使用を避けたいと思います。 '@class Foo'の中でこのアクションをトリガーしたいと思います。 –

+0

あなたはあまりにも欲しいと思います。 –

答えて

2

KVOは、非プロパティIVARでは正常に使用できません。

Objective-CのARCがIVARを使用していない場合、ランタイムから検出することはできません。あなたはKVOでそれを行うことはできません

、あなたはまだ通知を取得し、使用してIVARとオブジェクトを関連付けることによって、これをエミュレートすることができます。私はここでは、重複した質問でここに導かれた

0

deallocをオーバーライドすることをお勧めします。割り当てられるオブジェクトのタイプを知っていて、カスタムクラス(それ以外の場合はサブクラス)では、オブジェクトの割り当てが解除されたときにアクションを実行できます。これは、ARCが保持カウントをゼロに設定し、弱変数はゼロになります。

+0

KVOを使用しない方法がポップアウトされない限り、私はこれを受け入れます。乾杯! –

+1

うーん、これを試しましたが、ARCによって 'bar'がnilに設定されていても、' - (void)observeValueForKeyPath:... 'メソッドはトリガしません(私はそれを監視しています。 nilに設定します)。ドキュメンテーションは、それがプロパティのためだけに働くと述べているようです。それがイヤーズのために働くことは確かですか? –

+1

さらに、 ' - (void)observeValueForKeyPath:...'が '[self setValue:object forKey:@" bar "]'を実行してivarを設定すると、さらにテストするとトリガされますが、 'bar = object'を実行しています。いずれにしても、ARCがnilに設定するとトリガされません。これは私が探しているものです。 –

4

は私が答えたものですobjc_setAssociatedObject()では、弱い変数が消滅したときに割り当てが解除されます。あなたは、特定のIVARケースのためにそれに頼る方法を大きく上またはそれらの多くのために応じて、NSNotificationCenterまたは単にカスタムブロックを使用して、その非常に手の込んだノーティファイアの上に構築することができます

この解決策の良い点は、__weak ivarの種類を制御しなくても、どの__weak ivarでも動作することです。

関連する問題