OC源码分析-block (五)循环引用

一 : __weak 与 __unsafe_unretained

2012189-b54e5bfc2d710cc2.png

内存图

2012189-3cf3c5b888b2ce3f.png

解决方式 : __weak

typeof(perosn) 与上面相同,编译器特性.


2012189-3b4ad96a234946a0.png

内存图

2012189-0ddf6184985a1e47.png

解决方式 : __unsafe_unretained


2012189-e56d0328de993ef7.png

内存图 与weak一样

二 : __weak 与 __unsafe_unretained 区别

__weak :
引用的对象挂掉,其指针置为nil


2012189-78308849482d46ea.png

____unsafe_unretained:
还存在挂掉对象的地址,访问后会产生野指针.

三 :__block解决循环引用问题

2012189-f63bcdb3b4bd155a.png

源码

2012189-2d80d9dd1b24b378.png

内存结构图

weakSelf 相当于 __block_byref_person这个结构体变量的 person置为nill,循环链条断裂,彼此不再循环引用.


2012189-43d335f5270b5d11.png

四: MRC下

解决循环引用问题

MRC下__Block_byref结构体对象不会对里面的person进行强引用.是弱引用


2012189-f91b086795fb26ce.png

MRC 不支持__weak,所有有两种解决方案


2012189-c7a449c9512956e7.png

保证编译通过,确保在使用person时,不会挂掉


2012189-82c4647134b54f9e.png

猜你喜欢

转载自blog.csdn.net/weixin_34344677/article/details/87649057