美文网首页
ARC环境 下 block 在栈中 还是堆中?对block究竟是

ARC环境 下 block 在栈中 还是堆中?对block究竟是

作者: 荔枝lizhi_iOS程序猿 | 来源:发表于2021-05-23 12:23 被阅读0次

    问题:block是在栈中,还是堆中?,对block究竟是用copy还是strong?

    在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上

    具体都有哪些情况,还有待研究

    代码如下

    #import <Foundation/Foundation.h>
    
    typedef void (^MJBlock)(void);
    int weight = 100;
    // block的类型
    void blockClassType() {
        // 堆:动态分配内存,需要程序员申请申请,也需要程序员自己管理内存
        static int age = 10;
        // 局部static变量
        int height = 10;
    
        //1 __NSGlobalBlock__ Global:没有访问auto变量
        MJBlock block1 = ^ {
            NSLog(@"block1");
        };
        //2 __NSGlobalBlock__ Globa2:访问static变量
        MJBlock block2 = ^ {
            NSLog(@"block2 - age = %d",age);
        };
        //3 __NSGlobalBlock__ Globa3:访问全局变量
        MJBlock block3 = ^ {
            NSLog(@"block3 - weight = %d",weight);
        };
        //4 ARC环境下 __NSMallocBlock__ 会自动从栈上复制到堆上;(MRC环境下Stack):访问了auto变量
        MJBlock block4 = ^{
            NSLog(@"block4 - height = %d", height);
        };
        //5 NSMallocBlock - 对Block做copy操作
        MJBlock block_copy5 = [block4 copy];
        //6__NSMallocBlock__ - 对Block做strong操作
       __strong MJBlock block_strong = block4;
    
        NSLog(@"\n1=%@,%p\n 2=%@,%p\n 3=%@,%p\n 4=%@,%p\n 5_copy=%@,%p\n 6_strong=%@,%p\n",
              [block1 class],block1,
              [block2 class],block2,
              [block3 class],block3,
              [block4 class],block4,
              [block_copy5 class],block_copy5,
              [block_strong class],block_strong
        );
        NSLog(@"end");
    }
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            blockClassType();
        }
        return 0;
    }
    

    运行结果如下,


    运行输出结果

    总结:在ARC环境下,编译器会根据情况自动将栈上的block复制到堆上,用strong指针会指向原来的地址,copy是浅拷贝,和strong的作用相同。所以,在ARC环境下 ,block 用strong,copy修饰作用是一样的;但是在MRC环境下,block copy会把block从栈上复制到堆上。由于历史原因,所以在ARC 环境下 建议也用copy.

    相关文章

      网友评论

          本文标题:ARC环境 下 block 在栈中 还是堆中?对block究竟是

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