zoukankan      html  css  js  c++  java
  • 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],自然要将其拷贝到堆上。

  • 相关阅读:
    C#带日期型默认值参数的函数
    mvc调用webapi上传图片或文件
    mysql增删改查存储过程
    sql 分页存储过程
    sql 出库存储过程
    Ternura
    留言板
    友链
    .net 死锁
    C#微信小程序搜索框
  • 原文地址:https://www.cnblogs.com/Kelphizy/p/4536500.html
Copyright © 2011-2022 走看看