7

私はivar@class Fooを含むを持っています。__weak id bar異なるクラスのメソッドからのいくつかのアクションにより、オブジェクトが消えて、barナイルになる可能性があります。

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

bar可能であれば、プロパティに変換したり、Key-ValueObservingを使用したりすることは避けたいと思います。

これも可能ですか?そうでない場合、KVOはプロパティ以外のivarに対して使用できますか?

4

3 に答える 3

4

私はここで重複した質問に導かれました、これが私が答えたものです:

KVOでそれを行うことはできませんが、通知を受け取り、を使用してオブジェクトをiVarに関連付けることでこれをエミュレートできますobjc_setAssociatedObject()。これは、弱い変数が停止したときに割り当てが解除されます。

@interface WeakObjectDeathNotifier : NSObject
@end
@implementation WeakObjectDeathNotifier
- (void)dealloc
{
    // the code that shall fire when the property will be set to nil
}
@end

NSNotificationCenter特定のivarケースまたは多くの場合にどれだけ依存しているかに応じて、カスタムブロックを使用して、または単にカスタムブロックを使用して、その非常に複雑な通知機能の上に構築できます。

このソリューションの良いところは__weak、ivarのタイプを制御しなくても、どのivarでも機能することです__weak

于 2013-12-06T14:13:24.593 に答える
2

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

Objective-CのARCがIVARを無効にした場合、ランタイムから検出することはできません。

于 2013-09-16T12:03:49.637 に答える
0

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

于 2013-02-19T12:58:37.563 に答える