深入理解 __weak 修飾符

前言

剛開始接觸 weak 修飾符時(shí),是在使用 tableViewdelegate 屬性時(shí),當(dāng)時(shí)也就是僅僅知道在設(shè)置代理 delegate 屬性時(shí)使用weak修飾符;然后接觸了block,進(jìn)一步知道了 __weak 可以用來解決循環(huán)引用的問題,但對(duì)于它的底部實(shí)現(xiàn)原理還是不了解。所幸的是在大神的推薦下看了 《Objective-C 高級(jí)編程》這本書之后,對(duì)weak有個(gè)更深一步的認(rèn)識(shí)。

原理

// 1.聲明變量 obj
id obj = [[NSObject alloc] init];
// 2.聲明 weak_obj 對(duì)象
__weak weak_obj = obj;

// 第2部經(jīng)過編譯器編譯后
id weak_obj;
objc_initWeak(&weak_obj, obj); // 初始化 weak_obj 
objc_destoryWeak(&weak_obj); // 在作用域結(jié)束時(shí),銷毀 weak_obj


通過 objc_initWeak 函數(shù)初始化 weak_obj 變量,在作用域結(jié)束后調(diào)用objc_destoryWeak方法銷毀weak_obj變量。

緊接著objc_initWeak 函數(shù)會(huì)調(diào)用objc_storeWeak函數(shù)

weak_obj = 0; // 將 weak_obj 初始化為 0
objc_storeWeak(&weak_obj, obj); // 將 obj 作為 key,以weak_obj變量的地址(&weak_obj)注冊到weak表中

objc_destroyWeak函數(shù)同樣的也會(huì)調(diào)用objc_storeWeak函數(shù)

objc_storeWeak(&weak_obj, 0); // 當(dāng) obj 為 0 或者 nil 時(shí),將(&weak_obj)從weak表中刪除,并且將其引用計(jì)數(shù)清空

以上對(duì)于 objc_storeWeak 函數(shù)的解釋有點(diǎn)拗口,我自己的理解是:可以將 weak表 整體最為 value 去考慮,當(dāng) obj = nil 時(shí),清空 weak表中的數(shù)據(jù)。

不知道理解的是否正確,如有不正確的地方還請各位大神指點(diǎn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容