我有@class Foo
,其中包含__weak id bar
ivar。来自不同类中的方法的若干操作可能导致对象消失,从而导致bar
被隐藏。
我希望在ARC自动识别ivar时执行操作。
如果可能,我希望避免将bar
转换为属性或使用键值观察。
这甚至可能吗?如果没有,KVO可以用于非财产ivars吗?
答案 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将保留计数设置为零并设置时所发生的情况弱变量为零。