Block底层实现分析03-循环引用

Block底层实现分析03-循环引用_第1张图片

注:分析参考 MJ底层原理班 内容,本着自己学习原则记录

本文使用的源码为objc4-723

转 C++ 使用的命令 :
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m

1 ARC 下,循环引用现象

Block底层实现分析03-循环引用_第2张图片
Block底层实现分析03-循环引用_第3张图片
Block底层实现分析03-循环引用_第4张图片

2 ARC 下,解决循环引用

2.1 __weak修饰对象

Block底层实现分析03-循环引用_第5张图片
Block底层实现分析03-循环引用_第6张图片
Block底层实现分析03-循环引用_第7张图片

缺点:

  • 推荐使用这种方式

2.2 __unsafe_unretain修饰对象

Block底层实现分析03-循环引用_第8张图片
Block底层实现分析03-循环引用_第9张图片
Block底层实现分析03-循环引用_第10张图片

缺点:

  • 不安全
  • __weak__unsafe_unretain区别
    __weak:不会产生强引用,指向的对象销毁时,会自动将指针置nil,防止野指针错误
    __unsafe_unretain:不会产生强引用,不安全,指向的对象销毁时,指针置存储的地址值不变

2.3 __block修饰对象

Block底层实现分析03-循环引用_第11张图片
Block底层实现分析03-循环引用_第12张图片
Block底层实现分析03-循环引用_第13张图片

缺点:

  • block 必须要执行
  • 必须在 block 执行完任务后手动将指针置 nil

3 MRC 下,循环引用现象

使用指令:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-runtime=ios-8.0.0 main.m

Block底层实现分析03-循环引用_第14张图片
Block底层实现分析03-循环引用_第15张图片

4 MRC 下,解决循环引用

MRC 下不支持__weak

4.1 __unsafe_unretain

Block底层实现分析03-循环引用_第16张图片
Block底层实现分析03-循环引用_第17张图片

4.2 __block

Block底层实现分析03-循环引用_第18张图片
Block底层实现分析03-循环引用_第19张图片
  • 源码是没什么看头,可以从上一篇文章《Block底层实现分析02-__block使用 第8.3点1.MRC》里确定,在 MRC 下__block的对象不会对 person 进行强引用

文/Jacob_LJ(作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!

你可能感兴趣的:(Block底层实现分析03-循环引用)