美文网首页
Block本质(block类型)

Block本质(block类型)

作者: Goose的小黄花 | 来源:发表于2022-03-13 00:44 被阅读0次

    Block的类型

    block有三种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是集成自NSBlock类型
    ·NSGlobalBlock(_NSConcreteGlobalBlock)
    ·NSStackBlock(_NSConcreteStackBlock)
    ·NSMallocBlock(_NSConcreteMallocBlock)

    block在内存中位置.png
    void (^block1)(void) = ^{
        NSLog(@"Hello");
    };
    
    int age = 10;
    void (^block2)(void) = ^{
        NSLog(@"Hello - %d", age);
    };
    
    NSLog(@"%@ %@ %@", [block1 class], [block2 class], [^{
        NSLog(@"%d", age);
    } class]);
    
    运行结果
    Block[2068:75757] __NSGlobalBlock__ __NSMallocBlock__ __NSStackBlock__
    
    void (^block)(void) = ^{
         NSLog(@"Hello");
    };
        
    NSLog(@"%@", [block class]);
    NSLog(@"%@", [[block class] superclass]);
    NSLog(@"%@", [[[block class] superclass] superclass]);
    
    运行结果
    Block[2045:73636] __NSGlobalBlock__
    Block[2045:73636] NSBlock
    Block[2045:73636] NSObject
    

    block的类型怎么区分呢?


    block类型.png

    每一种类型的block调用copy后的结果


    block被copy后.png

    在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,比如以下情况
    ·block作为函数返回值时
    ·将block赋值给__strong指针时
    ·block作为Cocoa API中方法名含有usingBlock的方法参数时
    ·block作为GCD API的方法参数时

    相关文章

      网友评论

          本文标题:Block本质(block类型)

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