1、block的本质:是一个结构体,里面有一个isa指针;
![](https://img.haomeiwen.com/i1534714/5cbbe9e8a532335f.png)
![](https://img.haomeiwen.com/i1534714/c96e9623af4ece1a.png)
2、底层结构:__block_impl、__main_block_desc_0、__Block_byref_a_0 *a;
![](https://img.haomeiwen.com/i1534714/5b8b41735544bc73.png)
3、Block的分类:NSGlobalBlock、NSMallocBlock、NSStackBlock
a、NSGlobalBlock:全局、在数据区;没有访问 auto变量
![](https://img.haomeiwen.com/i1534714/fed8b9f4d3f66835.png)
b、NSMallocBlock:存储在堆上
![](https://img.haomeiwen.com/i1534714/1cc25846a8124980.png)
c、NSMallocBlock:存储在栈上,block捕获了自动变量,block没有执行过copy操作
![](https://img.haomeiwen.com/i1534714/dd1bc6954a701b6a.png)
4、block的定义:
![](https://img.haomeiwen.com/i1534714/2074c5cc13230e8b.png)
![](https://img.haomeiwen.com/i1534714/ef18be1f7c3f742a.png)
5、防止block循环引用:
a、__weak typeof(self) weakSelf = self;__strong__typeof(weakSelf)strongSelf = weakSelf;
![](https://img.haomeiwen.com/i1534714/598d7a535c176d22.png)
b、__block ViewController *vc = self;
![](https://img.haomeiwen.com/i1534714/48dfc7584d31ff32.png)
c、直接在blcok里面传入需要释放的对象
![](https://img.haomeiwen.com/i1534714/66f57ae1d739ec63.png)
网友评论