iOSInterviewQuestions
iOSInterviewQuestions copied to clipboard
第8题 感觉objc_storeWeak(&a, b)哪里理解有点问题
objc_storeWeak函数把第二个参数--赋值对象(b)的内存地址作为键值key,将第一个参数--weak修饰的属性变量(a)的内存地址(&a)作为value,注册到 weak 表中。如果第二个参数(b)为0(nil),那么把变量(a)的内存地址(&a)从weak表中删除, 你可以把objc_storeWeak(&a, b)理解为:objc_storeWeak(value, key),并且当key变nil,将value置nil。
/**
* This function stores a new value into a __weak variable. It would
* be used anywhere a __weak variable is the target of an assignment.
*
* @param location The address of the weak pointer itself
* @param obj The new object this weak ptr should now point to
*
* @return The value stored into \e location, i.e. \e obj
*/
OBJC_EXPORT id _Nullable
objc_storeWeak(id _Nullable * _Nonnull location, id _Nullable obj)
OBJC_AVAILABLE(10.7, 5.0, 9.0, 1.0, 2.0);
根据Apple的注视,应该是第一个&a 是作为key的 b是作为value的,当value变为nil后,将以&a为key的键值对从weak 表中移除
建议看看weak表的数据结构和实现,key值是对象地址,value 是weak指针地址没错。value值不会无缘无故变为nil的,只有当对象引用计数为0,调用dealloc析构,最后调用objc_clear_deallocating 函数,通过对象地址在weak表中获取value值,也就是所有的weak指针,赋值为 nil。
建议看看weak表的数据结构和实现,key值是对象地址,value 是weak指针地址没错。value值不会无缘无故变为nil的,只有当对象引用计数为0,调用dealloc析构,最后调用objc_clear_deallocating 函数,通过对象地址在weak表中获取value值,也就是所有的weak指针,赋值为 nil。
在多个__weak
的情况下,这个value
是不是可以理解为 数组结构呢?
建议看看weak表的数据结构和实现,key值是对象地址,value 是weak指针地址没错。value值不会无缘无故变为nil的,只有当对象引用计数为0,调用dealloc析构,最后调用objc_clear_deallocating 函数,通过对象地址在weak表中获取value值,也就是所有的weak指针,赋值为 nil。
在多个
__weak
的情况下,这个value
是不是可以理解为 数组结构呢?
如果一个对象被超过4根弱引用指针指向时,weak表存的是弱指针的哈希表。相当于: weakTable: { key(&b) : @{ &a : 1, &a2 : 1, &a3 : 1, &a4 : 1, ...} ... }