区分死弱引用与零值
Differentiate dead weak reference vs. nil value
据我所知,当我在 Objective-C 中取消引用一个死的弱引用时,我得到一个 nil
值作为结果。我想知道是否有任何方法可以真正判断 was 是否在变量消失后分配给变量的弱值,而不是简单地具有 value[= nil
的 21=](例如,如果从未分配引用)。
是否有我可以使用的较低级别的运行时函数?
我已经开始使用 BOOL
来记录何时分配引用,但这对我来说很难看。
不,无法判断弱引用是否已设置为 nil
,因为它的引用已被释放。
objc-weak.mm
中的weak_clear_no_lock
将弱引用设置为nil
。
正如罗布所说,你不能直接这样做。但你可以间接这样做。
通过使用关联对象,您可以将 NSObject
的子类与被弱引用的对象相关联。在该子类中,重写 dealloc
以通知某个对象正在释放弱引用对象。
只要您绝对确保弱引用对象对您的NSObject
子类的关联引用是对您子类实例的唯一强引用,那么您已经有效地创建了一种接收弱引用对象何时被释放的通知的方法。
是的,它很脆弱。对该子类的实例的一个额外的强引用和整个事情停止工作。
据我所知,当我在 Objective-C 中取消引用一个死的弱引用时,我得到一个 nil
值作为结果。我想知道是否有任何方法可以真正判断 was 是否在变量消失后分配给变量的弱值,而不是简单地具有 value[= nil
的 21=](例如,如果从未分配引用)。
是否有我可以使用的较低级别的运行时函数?
我已经开始使用 BOOL
来记录何时分配引用,但这对我来说很难看。
不,无法判断弱引用是否已设置为 nil
,因为它的引用已被释放。
objc-weak.mm
中的weak_clear_no_lock
将弱引用设置为nil
。
正如罗布所说,你不能直接这样做。但你可以间接这样做。
通过使用关联对象,您可以将 NSObject
的子类与被弱引用的对象相关联。在该子类中,重写 dealloc
以通知某个对象正在释放弱引用对象。
只要您绝对确保弱引用对象对您的NSObject
子类的关联引用是对您子类实例的唯一强引用,那么您已经有效地创建了一种接收弱引用对象何时被释放的通知的方法。
是的,它很脆弱。对该子类的实例的一个额外的强引用和整个事情停止工作。