//
// 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...