Block在内存中的位置在arc和mrc的区别

关于block在内存中的位置,

http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/这篇文章解释的不错,但是好像并没有区分arc和mrc的区别

block的位置分为这几种

  • NSGlobalBlock:类似函数,位于text段;
  • NSStackBlock:位于栈内存,函数返回后Block将无效;
  • NSMallocBlock:位于堆内存。

不引用外部环境变量的block都属于NSGlobalBlock, NSStackBlock和NSMallocBlock在arc和mrc下有所不同,mrc下引用外部环境变量的block属于NSStackBlock,对NSStackBlock的copy产生NSMallocBlock;而在arc下统一都是NSMallocBlock。

所以这样一段代码

    int (^plus1)(int a, int b)=^int(int a, int b){
        return a+b;
    };
    NSLog(@"plus1 = %@",plus1);

   int c = 100;

    int(^plus2)(int a, int b) = ^int(int a, int b){
        return c+a+b;
    };
    NSLog(@"plus2 = %@",plus2);

 arc下输出是:

plus1 = <__NSGlobalBlock__: 0x10a5ac350>

plus2 = <__NSMallocBlock__: 0x7fdecbf41270>

 

mrc下输出是:

 

plus1 = <__NSGlobalBlock__: 0x10f55b350>

plus2 = <__NSStackBlock__: 0x7fff50bdebe0>

 

 那是不是arc下面不会出现NSStackBlock呢,测试下面一段代码:

   __weak int(^plus2_5)(int a, int b) = ^int(int a, int b){
        return c+a+b;
    };
    NSLog(@"plus2_5 = %@",plus2_5);

    __weak int(^plus3)(int a, int b) = plus2;
    NSLog(@"plus3 = %@",plus3);

    NSLog(@"plus4 = %@",^int(){
        int a = c;
        return a;
    });

输出为:

plus2_5 = <__NSStackBlock__: 0x7fff5bcfcbb8>

plus3 = <__NSMallocBlock__: 0x7f7f7b625110>

plus4 = <__NSStackBlock__: 0x7fff5bcfcb78>

可以看出单独对block的声明,block还是会分布在栈上。而plus3为什么分布在了堆上,这是因为plus3的声明类似于[plus2 copy],自然要将其拷贝到堆上。

转载于:https://www.cnblogs.com/Kelphizy/p/4536500.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值