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

2021-05-23  本文已影响0人  荔枝lizhi_iOS程序猿

问题: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.

上一篇下一篇

猜你喜欢

热点阅读