塊
1.塊就是一個實現(xiàn)的閉包(closure),一個允許訪問其常規(guī)范圍之外的變量的函數(shù)。
2.一個Objective-C塊實際上就是一個對象,它是NSObject類的子類,擁有NSObject類的所有相關屬性(如向塊發(fā)送消息)。
塊的語法
1. 聲明塊類型的語法
塊類型由返回值類型和參數(shù)類型列表構成。使用脫字符(^)聲明塊類型的變量。
returnType (^blockName) (parameterType,parameterType,...)
例子:
int (^oneParamBlock)(int);
void (^twoParamsBlock)(int,int);//沒有返回值
void (^twoParamsBlock)(int param1,int param2);//與方法聲明類似,快變量聲明可以含有參數(shù)名稱
int (^noParamsBlock)(void);//沒有參數(shù)
2. 塊類型
通過typedef語句,創(chuàng)建類型定義為塊類型提供別名,起到簡化塊類型變量名稱的作用。
typedef returnType(^name)(arguments);
方法聲明中的塊變量:
typedef int(^AdderBlock)(int);
@interface Atom : NSObject
-(int)process:(int)count withBlock:(AdderBlock)adder;
@end
3. 塊常量表達式
使用塊常量表達式可以定義對塊的引用。
^returnType(參數(shù)類型 參數(shù)名稱,...){//塊代碼}
該表達式開頭的脫字符表名這個表達式是一個塊常量表達式。
例:
//1.塊常量表達式
^int (int a){
return a + 1;
};
//2.沒有設置返回值類型的塊常量表達式
^ (int a){
return a + 1;
};
//3.不帶參數(shù)的塊常量表達式
^ {
NSLog(@"Hello, World");
};
可以將塊常量賦予塊變量:
int (^myBlock)(int);
myBlock = ^int (int param){
return param * param;
};
可以將塊聲明和塊定義組合到一條語句中:
int (^myBlock)(int) = ^int (int param){
return param * param;
};
4. 調用
只有調用塊時,才會執(zhí)行其{}體內的代碼
聲明了塊類型變量并賦予塊常量后,就可以直接調用操作符調用該變量。
int a = myBlock(5);
NSLog(@"a is %d",a);
//打印:a is 25
5. __block
默認情況下,塊常量表達式可以訪問局部變量,但不能修改局部變量。使用__block修飾局部變量,可以修改局部變。
__block int myVar = 10;
void (^intBlock)(int) = ^(int amount){
myVar += amount;
NSLog(@"New value = %d",myVar);
};
intBlock(5);
當引用變量的塊被復制到堆存儲區(qū)域時,使用__block修改符的變量也會被復制到堆存儲區(qū)域。