2.Blocks

作者: LucXion | 来源:发表于2021-08-18 09:58 被阅读0次

带有自动变量值的匿名函数

五种变量:自动变量(局部变量)、函数参数、局部静态变量、全局静态变量、全局变量

其中能够在多次调用之间能够传递值的是:静态变量(局部、全局)、全局变量

Blocks的省略方式

Block省略
    // 通过typedef简化Block类型
    typedef int(^Block)(int);
    Block b = ^(int a){
        return a + 1;
    };

Blocks的实现

将代码转化为普通的C函数代码来实现,核心是objc_msgSend函数,从对象持有类的结构体中,检索函数的指针并调用。Block即为Objective-C对象。

Blocks 截获自动变量的值

将自动变量保存到block结构体实例中

    int num = 10;
    void(^block)(void) = ^(){
        // 截获所使用的自动变量的瞬间值
        printf("inside num = %d\n",num);
    };
    num = 5;
    block();
    printf("outside num = %d\n",num);

__block (存储域类)说明符:修饰自动变量,使自动变量能在block内赋值。底层会生成一个 __block的结构体

    __block int num = 10;
    void(^block)(void) = ^(){
        // 只有执行block才会修改赋值
        num = 11;
    };
    printf("1: %d\n",num); 
    num = 5;
    printf("2: %d\n",num);
    block();
    printf("3: %d\n",num);

Blocks使用静态变量

将静态变量指针static_val传递给结构体__main_block_imp1_0的构造函数并保存。

什么时候Block会从栈复制到堆

  • 调用copy方法

  • block作为函数返回值

  • block赋值给__strong修饰符id类型的类或者Block类型成员变量

  • 方法名中含有UsingBlock的Cocoa框架方法,或GCD中传递的block

如何避免Block的循环引用

__weak , 也可以使用__block, __block的优点就是可以控制释放,当不需要的时候只需要 = nil就能释放,缺点就是必须要执行block体,否则对象不会被释放

相关文章

  • 2.Blocks

    带有自动变量值的匿名函数 五种变量:自动变量(局部变量)、函数参数、局部静态变量、全局静态变量、全局变量 其中能够...

  • block1

    1.什么是block 2.blocks语法 3.block类型变量 4.截获自动变量 5.__block说明符: ...

  • 《Objective-C高级编程 iOS与OS X多线程与内存管

    Blocks篇:2.Blocks的调用过程及其对象本质 Blocks实际上是通过支持Block的编译器,将其转换为...

网友评论

      本文标题:2.Blocks

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