block的實現原理

2021-07-02 03:12:24 字數 1250 閱讀 1382

//

// main.m

//#import // block實際上是: 指向結構體的指標

// 編譯器會將block的內部**生成對應的函式

//void __test1_block_func_0()

////void test1()

//;//

// a = 20;

//

// block(); // 10

//}//void test2()

//;//

// a = 20;

//

// block(); // 20

//}//void test3()

//;//

// a = 20;

//

// block(); // 20

//}//

//int a = 10;

//void test4()

//;//

// a = 20;

//

// block();

//}#import "dog.h"

int main(int argc, const char * argv)

;// nslog(@"%zd", [d retaincount]);

// block_copy(block); // 2

// nslog(@"%zd", [d retaincount]);

//

// [d release]; // 1

dog *d = [[dog alloc] init]; // 1

// d.block = ^;

[d release]; // 0

}return 0;

}/**

1.預設情況下, block的記憶體是在棧中

* 它不會對所引用的物件進行任何操作

2.如果對block做一次copy操作, block的記憶體就會在堆中

* 它會對所引用的物件做一次retain操作

* 非arc : 如果所引用的物件用了__block修飾, 就不會做retain操作

* arc : 如果所引用的物件用了__unsafe_unretained\__weak修飾, 就不會做retain操作

*/

Block中 block實現原理

三.block中 block實現原理 我們繼續研究一下 block實現原理。1.普通非物件的變數 先來看看普通變數的情況。import int main int argc,const char ar myblock return 0 把上述 用clang轉換成原始碼。struct block byr...

Block實現原理

import int main int argc,const char argv i 3 myblock return 0 執行結果 i的值是 2為什麼是2 不是3呢?帶著這個疑問我們往下看 編譯main.m檔案,1.開啟終端,2.找到工程檔案,3.找到main.m檔案所在的位置,4.clang r...

block的底層實現原理

block就是指向結構體的指標,編譯器會將block的內部 生成對應的函式,利用這個指標就可以呼叫這個函式.普通的區域性變數是值傳遞,用 block static 或者是全域性變數就是位址傳遞 block的記憶體預設是存放在棧裡面的,他不會對所引用的物件進行操作 如果對block做一次copy操作b...