随着 ARC 的出现,提供了一些新功能,允许开发人员使用弱引用对象。id objc_loadWeak(id *location)是其中之一。此函数接收一个参数,该参数与内存中存储弱对象的位置相对应,如果该对象仍然存在或nil已被释放,则返回该对象。
似乎当一个对象obj存储weak在一个带有 的位置location时id objc_storeWeak(id *location, id obj),obj它被放在一个“弱地图”中,location作为一个键。但是,为了检索obj,objc_loadWeak不能只location用作键并返回对应的值obj。它还必须检查是否还活着,如果不再obj存在则返回。nil
但是,objc_loadWeak不能尝试读取对象的保留计数,因为对象可能已被释放。此外,尽管弱映射、objc_storeWeak和objc_loadWeak类NSObject是在同一个文件(NSObject.mm)中实现的,但NSObject的dealloc方法不会向弱映射发出信号,表明正在被释放的对象正在消失。
那么,Objective-C 运行时如何判断一个weak对象是否还活着呢?