iOS 块

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修改符的变量也会被复制到堆存储区域。

你可能感兴趣的:(iOS 块)