随着 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
对象是否还活着呢?