用__weak修饰声明的引用,即得到对象的弱引用
相关资料:
弱引用能做什么:
在引用计数的回收机制下,弱引用(weak reference)不会增加引用计数,如此一来就不会影响对象被回收的时机(当对象回收时,弱引用会置为空指针)。
实现弱引用的机制有哪些要素:
弱引用的标记与清理
oc的实现:
oc以额外存储弱引用的方式来标记弱引用,当生成一个弱引用时,oc会将弱引用存储在和引用的对象关联的弱引用存储区,在对象销毁时清空该存储区内容
代码上:
对象关联的引用存储sidetable(去掉了部分代码)
struct SideTable {
spinlock_t slock;
RefcountMap refcnts;
weak_table_t weak_table;
};
struct weak_table_t {
weak_entry_t *weak_entries;
size_t num_entries;
uintptr_t mask;
uintptr_t max_hash_displacement;
};
weak_entry_t 是weak_table_t真正用于存储弱引用的地方,以散列表的形式存储(存储细节可参考 weak 弱引用的实现方式)
struct weak_entry_t {
DisguisedPtr<objc_object> referent;
union {
struct {
weak_referrer_t *referrers;
uintptr_t out_of_line_ness : 2;
uintptr_t num_refs : PTR_MINUS_2;
uintptr_t mask;
uintptr_t max_hash_displacement;
};
struct {
// out_of_line_ness field is low bits of inline_referrers[1]
weak_referrer_t inline_referrers[WEAK_INLINE_COUNT];
};
};
};