block的概念及簡單用法,通俗易懂

2021-06-21 10:05:02 字數 3343 閱讀 9848



**塊本質上是和其他變數類似。不同的是,**塊儲存的資料是乙個函式體。使用**塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。

脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的**)。下圖是如何把塊變數賦值給乙個變數的語法講解:

按照呼叫函式的方式呼叫塊物件變數就可以了:

int result = myblock(4); // result是 28

[cpp]view plain

copy

print?

void (^printblock)(nsstring *x);  

printblock = ^(nsstring* str)  

;  printblock(@"hello world!");  

void (^printblock)(nsstring *x);

printblock = ^(nsstring* str)

;printblock(@"hello world!");

執行結果是:

print:hello world!

[cpp]view plain

copy

print?

nsarray *stringarray = [nsarray arraywithobjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];  

nscomparator sortblock = ^(id string1, id string2)  

;  nsarray *sortarray = [stringarray sortedarrayusingcomparator:sortblock];  

nslog(@"sortarray:%@", sortarray);  

nsarray *stringarray = [nsarray arraywithobjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];

nscomparator sortblock = ^(id string1, id string2)

;nsarray *sortarray = [stringarray sortedarrayusingcomparator:sortblock];

nslog(@"sortarray:%@", sortarray);

執行結果:

sortarray:(

"abc 05",

"abc 1",

"abc 12",

"abc 13",

"abc 21")

**塊想要遞迴呼叫,**塊變數必須是全域性變數或者是靜態變數,這樣在程式啟動的時候**塊變數就初始化了,可以遞迴呼叫

[cpp]view plain

copy

print?

static

void (^ const blocks)(int) = ^(int i)  

};  

blocks(3);  

static void (^ const blocks)(int) = ^(int i)

};blocks(3);

執行列印結果:

num:3

num:2

num:1

在**塊中可以使用和改變全域性變數

[cpp]view plain

copy

print?

int global = 1000;  

int main(int argc, const

char * argv)  

;  block();  

nslog(@"global:%d", global);  

}  return 0;  

}  

int global = 1000;

int main(int argc, const char * argv)

; block();

nslog(@"global:%d", global);

}return 0;

}

執行列印結果:

global:1001

global:1001

而區域性變數可以使用,但是不能改變。

[cpp]view plain

copy

print?

int local = 500;  

void(^block)(void) = ^(void)  

;  block();  

nslog(@"local:%d", local);  

int local = 500;

void(^block)(void) = ^(void)

;block();

nslog(@"local:%d", local);

在**塊中改變區域性變數編譯不通過。怎麼在**塊中改變區域性變數呢?在區域性變數前面加上關鍵字:__block

[cpp]view plain

copy

print?

__block int local = 500;  

void(^block)(void) = ^(void)  

;  block();  

nslog(@"local:%d", local);  

__block int local = 500;

void(^block)(void) = ^(void)

;block();

nslog(@"local:%d", local);

執行結果:

local:501

local:501

Block的簡單用法

1.block簡單用法 import 1.求兩個數的和 void createblock 1.1呼叫block int c sumblock 10,9 nslog d c 2.求兩個數的平方 void sqrtblock 2.1呼叫block int d sqrts 10,10 nslog d d ...

mysql的簡單用法 mysql簡單用法

刪除使用者 drop user jack drop比delete刪除的優勢在於drop可以刪除使用者的許可權,更加徹底 更改使用者名稱 rename user jack to jacknew 使用者的都存在與user表中,更改名稱,許可權不變 更改使用者密碼 update mysql.user se...

volatile變數的概念及用法

volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。int i 5 int a i int b i 編譯器發現兩次從i讀資...