简单理解block的种类

作者: 蜗蜗牛在奔跑 | 来源:发表于2019-12-04 11:17 被阅读0次

    块(Block)分为三类:

    • 栈块
    • 堆块
    • 全局块

    1. 栈block

    定义块的时候,其所占内存区域是分配在栈中的,而且只在定义它的那个范围内有效:

    void (^block)();
    if ( /* some condition */ ) {
    block = ^{
    NSLog(@"Block A");
    };
    } else {
    block = ^{
    NSLog(@"Block B");
    };
    }
    block();

    上面定义的两个块只在if else语句范围内有效,一旦离开了最后一个右括号,如果编译器覆写了分配给块的内存,那么就会造成程序崩溃

    2. 堆block

    为了解决这个问题,我们可以给对象发送copy消息,复制一份到堆里,并自带引用计数:

    void (^block)();
    if ( /* some condition */ ) {
    block = [^{
    NSLog(@"Block A");
    } copy];
    } else {
    block = [^{
    NSLog(@"Block B");
    } copy];
    }
    block();

    3. 全局block

    全局块声明在全局内存里,而不需要在每次用到的时候于栈中创建。

    void (^block)() = ^{
    NSLog(@"This is a block");
    };

    相关文章

      网友评论

        本文标题:简单理解block的种类

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