__weak及弱引用简记

用__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];
        };
    };
};


__attribute__((weak))是一个GCC编译器的特性,用于声明函数或变量为弱符号引用。在使用该特性时,可以在调用某个模块的函数时,即使该函数在该模块中未定义也不会报重复定义的错误。 举个例子,如果在模块A中调用了模块B的函数,但是模块B的函数可能未定义,可以在模块A中使用__attribute__((weak))来声明需要调用的函数为弱符号引用。这样,在模块A的代码中,可以通过检查该函数的指针是否为NULL来判断该函数是否存在,从而避免因为函数未定义而导致的错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ARM 之十一__weak 代码 WEAK.7z](https://download.csdn.net/download/ZCShouCSDN/12572659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [__attribute__系列之__attribute__((weak))](https://blog.csdn.net/weixin_45367955/article/details/130532947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [__attribute__((weak))介绍以及用法](https://blog.csdn.net/weixin_42031299/article/details/116269010)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值