7

我有一个@class Foo包含__weak id barivar。来自不同类中的方法的几个操作可能导致对象消失并因此被bar取消。

我想在 ARC 自动取消 ivar 时执行一个操作。

如果可能的话,我想避免bar变成属性或使用键值观察。

这甚至可能吗?如果不是,KVO 可以用于对抗非财产 ivars 吗?

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 案例或其中许多案例的依赖程度。

这个解决方案的好处是它适用于任何__weakivar,即使您不控制__weakivar 的类型。

于 2013-12-06T14:13:24.593 回答
2

KVO 无法成功用于非财产 IVAR。

当 Objective-C 的 ARC 取消 IVAR 时,您无法从运行时检测到。

于 2013-09-16T12:03:49.637 回答
0

我建议覆盖dealloc。如果您知道将要分配的对象的类型,并且它是一个自定义类(否则为它的子类),您可以在对象被释放时执行该操作,这正是 ARC 将保留计数设置为零并设置弱变量为零。

于 2013-02-19T12:58:37.563 回答