我有一个@class Foo
包含__weak id bar
ivar。来自不同类中的方法的几个操作可能导致对象消失并因此被bar
取消。
我想在 ARC 自动取消 ivar 时执行一个操作。
如果可能的话,我想避免bar
变成属性或使用键值观察。
这甚至可能吗?如果不是,KVO 可以用于对抗非财产 ivars 吗?
我有一个@class Foo
包含__weak id bar
ivar。来自不同类中的方法的几个操作可能导致对象消失并因此被bar
取消。
我想在 ARC 自动取消 ivar 时执行一个操作。
如果可能的话,我想避免bar
变成属性或使用键值观察。
这甚至可能吗?如果不是,KVO 可以用于对抗非财产 ivars 吗?
我被一个重复的问题引导到这里,这是我的回答:
你不能用 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,即使您不控制__weak
ivar 的类型。
KVO 无法成功用于非财产 IVAR。
当 Objective-C 的 ARC 取消 IVAR 时,您无法从运行时检测到。
我建议覆盖dealloc。如果您知道将要分配的对象的类型,并且它是一个自定义类(否则为它的子类),您可以在对象被释放时执行该操作,这正是 ARC 将保留计数设置为零并设置弱变量为零。