块
1.块就是一个实现的闭包(closure),一个允许访问其常规范围之外的变量的函数。
2.一个Objective-C块实际上就是一个对象,它是NSObject类的子类,拥有NSObject类的所有相关属性(如向块发送消息)。
块的语法
1. 声明块类型的语法
块类型由返回值类型和参数类型列表构成。使用脱字符(^)声明块类型的变量。
returnType (^blockName) (parameterType,parameterType,...)
例子:
int (^oneParamBlock)(int);
void (^twoParamsBlock)(int,int);//没有返回值
void (^twoParamsBlock)(int param1,int param2);//与方法声明类似,快变量声明可以含有参数名称
int (^noParamsBlock)(void);//没有参数
2. 块类型
通过typedef语句,创建类型定义为块类型提供别名,起到简化块类型变量名称的作用。
typedef returnType(^name)(arguments);
方法声明中的块变量:
typedef int(^AdderBlock)(int);
@interface Atom : NSObject
-(int)process:(int)count withBlock:(AdderBlock)adder;
@end
3. 块常量表达式
使用块常量表达式可以定义对块的引用。
^returnType(参数类型 参数名称,...){//块代码}
该表达式开头的脱字符表名这个表达式是一个块常量表达式。
例:
//1.块常量表达式
^int (int a){
return a + 1;
};
//2.没有设置返回值类型的块常量表达式
^ (int a){
return a + 1;
};
//3.不带参数的块常量表达式
^ {
NSLog(@"Hello, World");
};
可以将块常量赋予块变量:
int (^myBlock)(int);
myBlock = ^int (int param){
return param * param;
};
可以将块声明和块定义组合到一条语句中:
int (^myBlock)(int) = ^int (int param){
return param * param;
};
4. 调用
只有调用块时,才会执行其{}体内的代码
声明了块类型变量并赋予块常量后,就可以直接调用操作符调用该变量。
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);
当引用变量的块被复制到堆存储区域时,使用__block修改符的变量也会被复制到堆存储区域。
网友评论