block傳值也適用於從後往前傳值
先介紹block的基本知識
- /**
- * 1、如何定義一個Block變數
- 2、怎樣給定義的Block變數賦初值
- 3、如何衝定義Block型別
- 4、如何使用Block實現具體的佛那個能
- 5、Block與變數作用域的關係
- */
- int sum(int a, int b) {
- return a + b;
- }
- int count = ;
- int main(int argc, const char * argv[]) {
- /**
- * 1、Block是一種資料型別,並且是一種自定義的資料型別
- 2、Block的標誌是^(託字元)
- 3、Block是匿名函式,TA與函式最主要的區別在於,函式在編譯器就已經知道封裝了什麼功能,但是Block只有當執行時才知道內部封裝的功能,所以說Block更加靈活多變
- 4、Block的作用也是封裝程式碼段來實現具體的功能
- 5、既然Block是匿名函式,所以賦值時,不能將函式名直接賦值,初值為函式的實現體
- */
// __block修飾基本型別,會將基本型別轉成物件型別,將地址傳入blcok中使用,block內外操作的是同一塊記憶體,如果不加__block修飾,那麼block內外使用的是不同的記憶體
// __weak不能對基本型別操作- __block int a = ;
- void (^testBlock)() = ^ {
- NSLog(@"%d",a);//Block內部可以訪問區域性變數的值
- a = ; //Block內部如果想修改外界區域性變數的值,必須對變數進行__block修飾
- count = ;//Block內部可以直接修改全域性變數的值,也可以直接訪問全域性變數的值
- };
- testBlock();
- NSLog(@"a = %d, count = %d",a, count);
- int (*p)(int, int) = sum;
- typedef int (*P)(int, int);
- //myBlock是一個有參有返的匿名函式
- //myBlock是變數名
- //Block型別為 int (^)(int , int),表示此Block為有一個整型返回值,兩個整型引數的匿名函式
- //初值為:
- // ^(int a, int b) {
- // return a + b;
- // }
- /**
- * 書寫格式
- 1、初值中的返回值型別可以省略不寫,但是必須保證,函式內部返回給外界的值的型別與返回值型別相同
- 2、定義Block變數的型別中,引數名可以省略不寫,但是初值中引數名不能不寫,否則無法參與運算
- 3、如果Block沒有引數,那麼在初值中表示引數的小括號可以省略不寫
- */
- typedef int (^MyBlock)(int, int);
- int (^myBlock)(int, int) = ^(int a, int b) {
- return a + b;
- };//Blocl實現
- NSLog(@"result is %d",myBlock(, ));//Block執行
- MyBlock subBlock = ^(int a, int b) {
- return a - b;
- };
- void (^helloBlock)() = ^ {
- NSLog(@"hello world");
- };
- //將字串轉整型
- int (^intBlock)(NSString *) = ^(NSString *string) {
- return [string intValue];
- };
- NSComparisonResult (^compareBlock)(NSString *, NSString *) = ^(NSString *str1, NSString *str2) {
- return [str1 compare:str2];
- };
- NSLog(@"%ld",compareBlock(@"a", @"b"));
- helloBlock();
- NSLog(@"%d",intBlock(@""));
- return ;
- }