Objective-C中Block的存储域

作者: 不思想者Alex | 来源:发表于2015-04-28 15:08 被阅读5890次

    Block 在 Objective-C 中也是被当成对象的, Block 有三种类。

    设置对象的存储区域
    _NSConcreteStackBlock
    _NSConcreteClobalBlock 程序的数据区域(.data 区)
    _NSConcreteMallocBlock
        void(^globalBlock)(void) = ^{
            NSLog(@"globalBlock");
        };
        NSLog(@"%@", globalBlock); //<__NSGlobalBlock__: 0x105f6b0c0>
    

    在没有捕获任何自动变量的时候, Block 的类型为NSGlobalBlock.

        int a = 0;
        void(^stacklBlock)(void) = ^{
            NSLog(@"stacklBlock, a = %d", a);
        };
        NSLog(@"%@", stacklBlock);//<__NSStackBlock__: 0x7fff59c94ac0>
    

    捕获自动变量的时候, Block 的类型为NSStackBlock.

        void(^mallocBlock)(void) = [stacklBlock copy];
        NSLog(@"%@", mallocBlock);//<__NSMallocBlock__: 0x7fced2e8d240>
    

    对 Block 在堆上进行复制的时候, 复制后的类型为NSMallocBlock.

    将 Block 作为函数的返回值时, 编译器会自动生成复制到堆上的代码. Blocks 从栈上复制到堆中, 这样即使 Block 的变量作用域结束, 堆上的 Block 还可以继续存在.

    在ARC开启的情况下,将只会有NSConcreteGlobalBlockNSConcreteMallocBlock类型的block。原本的NSConcreteStackBlock的block会被NSConcreteMallocBlock类型的block替代。

    相关文章

      网友评论

      本文标题:Objective-C中Block的存储域

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