Block在內存中的位置在arc和mrc的區別

關於block在內存中的位置,git

http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/這篇文章解釋的不錯,可是好像並無區分arc和mrc的區別github

block的位置分爲這幾種函數

  • NSGlobalBlock:相似函數,位於text段;
  • NSStackBlock:位於棧內存,函數返回後Block將無效;
  • NSMallocBlock:位於堆內存。

不引用外部環境變量的block都屬於NSGlobalBlock, NSStackBlock和NSMallocBlock在arc和mrc下有所不一樣,mrc下引用外部環境變量的block屬於NSStackBlock,對NSStackBlock的copy產生NSMallocBlock;而在arc下統一都是NSMallocBlock。測試

因此這樣一段代碼spa

    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下輸出是:code

plus1 = <__NSGlobalBlock__: 0x10a5ac350>blog

plus2 = <__NSMallocBlock__: 0x7fdecbf41270>內存

 

mrc下輸出是:get

 

plus1 = <__NSGlobalBlock__: 0x10f55b350>it

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],天然要將其拷貝到堆上。

相關文章
相關標籤/搜索