**塊本質上是和其他變數類似。不同的是,**塊儲存的資料是乙個函式體。使用**塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。
脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的**)。下圖是如何把塊變數賦值給乙個變數的語法講解:
按照呼叫函式的方式呼叫塊物件變數就可以了:
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讀資...