__weak及弱引用简记

来源:互联网 发布:淘宝网的性用品有用吗 编辑:程序博客网 时间:2024/04/28 19:04

用__weak修饰声明的引用,即得到对象的弱引用


相关资料:

官方资料

weak的生命周期:具体实现方法

弱引用能做什么:

在引用计数的回收机制下,弱引用(weak reference)不会增加引用计数,如此一来就不会影响对象被回收的时机(当对象回收时,弱引用会置为空指针)。

实现弱引用的机制有哪些要素:

弱引用的标记与清理

oc的实现:

oc以额外存储弱引用的方式来标记弱引用,当生成一个弱引用时,oc会将弱引用存储在和引用的对象关联的弱引用存储区,在对象销毁时清空该存储区内容

代码上:

对象关联的引用存储sidetable(去掉了部分代码)

struct SideTable {    spinlock_t slock;    RefcountMap refcnts;    weak_table_t weak_table;};


weak_table_t用于存储所有弱引用(去掉了部分代码)
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];        };    };};


0 0
原创粉丝点击