OC原理知识

最认真的Block

2018-12-22  本文已影响0人  MrBMask

block的本质:

1.block的本质其实就是一个oc对象(内部有isa指针),内部封装了函数调用和函数调用(函数参数)的oc对象。
2.block的底层结构如图:


block的底层结构.png

2.block捕获机制:

为了保证block能够正常访问外部的变量,block有个变量捕获机制。

block捕获机制.jpg

3.block类型:

block类型
block在内存中的分配

4.block的copy

在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况:

5.对象类型的auto变量

  1. 会调用block内部的copy函数
    copy函数内部会调用_Block_object_assign函数
    _Block_object_assign函数会根据auto变量的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用

6.__block修饰符和内存管理

__block不能修饰全局变量、静态变量(static)

编译器会将__block变量包装成一个对象

如果__block变量从堆上移除
会调用__block变量内部的dispose函数
dispose函数内部会调用_Block_object_dispose函数
_Block_object_dispose函数会自动释放指向的对象(release)

7.解决循环引用问题 - ARC

1.用__weak、__unsafe_unretained解决:
__weak 对象销毁时系统会自动置为nil,__unsafe_unretained会产生野指针


image.png

2.用__block解决(必须要调用block):


image.png

8.解决循环引用问题 - MRC

1.用__unsafe_unretained解决:


image.png

2.用__block解决:


image.png
上一篇下一篇

猜你喜欢

热点阅读