【发布时间】:2013-02-13 13:26:36
【问题描述】:
随着 ARC 的出现,提供了一些新功能,允许开发人员使用弱引用对象。 id objc_loadWeak(id *location) 就是其中之一。此函数接收一个参数,该参数与内存中存储弱对象的位置相对应,如果该对象仍然存在,则返回该对象,如果已解除分配,则返回 nil。
似乎当对象obj 以weak 存储在id objc_storeWeak(id *location, id obj) 的位置location 中时,obj 被放入“弱映射”中,location 作为键。但是,为了检索obj,objc_loadWeak不能只使用location作为key并返回对应obj的值。它还必须检查obj 是否还活着,如果不存在则返回nil。
但是,objc_loadWeak 无法尝试读取对象的保留计数,因为该对象可能已被释放。此外,虽然弱映射 objc_storeWeak、objc_loadWeak 和 NSObject 类在同一个文件中实现(NSObject.mm),但 NSObject 的 dealloc 方法不会向弱映射发出信号:被释放的对象正在消失。
那么,Objective-C 运行时如何判断 weak 对象是否仍然存在?
【问题讨论】:
标签: objective-c automatic-ref-counting weak-references objective-c-runtime