前言
剛開始接觸 weak 修飾符時(shí),是在使用 tableView 的 delegate 屬性時(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)