希望在__weak ivar被识别时执行操作

时间:2013-02-19 12:21:48

标签: objective-c automatic-ref-counting ivar

我有@class Foo,其中包含__weak id bar ivar。来自不同类中的方法的若干操作可能导致对象消失,从而导致bar被隐藏。

我希望在ARC自动识别ivar时执行操作。

如果可能,我希望避免将bar转换为属性或使用键值观察。

这甚至可能吗?如果没有,KVO可以用于非财产ivars吗?

3 个答案:

答案 0 :(得分:4)

我被带到了一个重复的问题,这是我回答的问题:

你不能用KVO做到这一点,但你仍然可以通过使用objc_setAssociatedObject()将对象与你的iVar相关联来获得通知和模拟,当弱变量消失时它将被释放。

@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的类型。

答案 1 :(得分:2)

KVO无法在非属性IVAR上成功使用。

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

答案 2 :(得分:0)

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