美文网首页
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究竟是

    问题:block是在栈中,还是堆中?,对block究竟是用copy还是strong? 在ARC环境下,编译器会根据...

  • 09-13、Block注意事项(重要)

    4、注意:block是存储在堆中还是栈中?默认情况下block存储在栈中, 如果对block进行一个copy操作,...

  • #1-对于block的理解,mrc和arc的区别

    block在ARC和MRC中的声明引用有些区别: copy使栈中的block转移到堆中,并对block会引用的对象...

  • Block注意事项

    1.block是存储在堆中还是栈中? 默认情况下block在栈中,但是如果对block进行了一个copy操作,bl...

  • Block 到底啥时候崩溃?

    文章目录 block 的数据结构 全局block 栈block 堆block ARC下的 block 全局bloc...

  • block 在ARC下对变量的影响

    在ARC :Block访问外部的变量 ARC环境下,当单纯定义一个block存储在全局区 ARC环境下,block...

  • 06.3-OC中block的copy操作

    block的copy操作 在ARC环境下,编译器会根据情况自动地将栈内存上的block拷贝到堆内存上,以下几种情况...

  • block的注意点

    copy 是从栈中拷贝到堆中 block在 ARC的情况下,一般情况下,它是自动 copy 的, property...

  • Block 03 - 内存管理

    Block 03 - 内存管理 Block 的 copy 在 ARC 环境下,编译器会根据情况自动将栈上的 Blo...

  • block

    1.block默认在栈中,调用_Block_copy(只会改变栈block的存储区域)会将block拷贝到堆;赋值...

网友评论

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

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