iOS之Block

作者: Aliv丶Zz | 来源:发表于2021-02-03 18:10 被阅读0次
【资料整理】

1. block本质

block上也是一个OC对象,它内部也有一个isa指针,它是封装了函数调用以及函数调用环境的OC对象,block的底层调用结构如图所示


block底层结构.png

block1声明

 int age = 10;
        void(^block1)(void) = ^{
            NSLog(@"block2:%d",age);
        };
  • block1对应的底层代码


    image.png

__main_block_impl_0: 为block1对应的结构体,结构体里面的__main_block_impl_0为构造函数(OC中的init方法),返回结构体本身
__main_block_func_0: 为block1括号内实现
__main_block_desc_0: 存放着block在内存中占用的大小
age : 外部捕获的auto变量,值传递,不可修改


block1声明

__weak NSString *age = @"10";
        void(^block1)(void) = ^{
            NSLog(@"block2:%@",age);
        };
  • block1对应的底层代码


    image.png

2. block的类型

block有三种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型

         int age = 10;
        
         void(^block)(void) = ^{
             NSLog(@"block ");
         };
     
         void(^block1)(void) = ^{
             NSLog(@"block2:%d",age);
         };
        
         NSLog(@"--- %@",[block class]);
        
         NSLog(@"--- %@", [block1 class]);

        
        NSLog(@"--- %@",[^{
            NSLog(@"block3:%d",age);
        } class]);

输出结果:

--- NSGlobalBlock //栈区
--- NSMallocBlock // 堆区
--- NSStackBlock //数据段 .data

image.png

3. block的变量捕获

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

注意:正是因为这种捕获机制,对于外部的auto局部变量,则不能直接在block内部直接修改。

image.png

4. __block 修饰符

image.png

__block的内存管理

image.png

__block 中的 __forwarding指针

image.png

被__block 修饰的对象类型

image.png

5.block内服访问: 对象类型的auto变量、__block变量

image.png

block的copy

image.png

block的循环引用问题

image.png

相关文章

网友评论

    本文标题:iOS之Block

    本文链接:https://www.haomeiwen.com/subject/hecntktx.html