Block的理解和使用
bolck的功能:
和通知、代理类似, 通俗的讲就是为了完成即将完成的事情. 还有就是, 定义的block内部的代码只有在block被调用的时候才会执行, 在下边的具体中会介绍.
一、语法:
(1)block作为本地变量(local variable)
returnType (^blockName)(parameterTypes) = ^returnType(parameters){...};
(2)block作为类的成员属性(@property)
@property (nonatomic, copy) returnType (^blockName)(parameters);
这时候可以类比delegate,实现代理功能。
(3)block作为函数参数(method parameter)
- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;
调用包括block参数的函数,
[someObject somethodThatTakesABlock:^returnType(parameters){...}];
(4)使用typedef定义block类型
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters){...};
二、举例:
(1)block作为本地变量
- (void)viewDidLoad {
[super viewDidLoad];
void (^printNum)() = ^(){
NSLog(@"no num"); // 后执行
};
printNum(); // 先调用
void (^printNum1)(int,int) = ^(int a, int b) {
NSLog(@"%d",a*b); // 后执行
};
printNum1(1,9); // 先调用
int c = 0;
_ _block int d = 0;
void (^printNum2)(int,int) = ^(int a, int b) {
c = a + b; // 编译报错
d = a + b;
NSLog(@"%d",c);
NSLog(@"%d",d);
};
printNum2(1,9); // block内部修改外部变量的时候, 需要在外部变量前边加上 _ _block
// 3个 printNum 的打印都是在调用之后再执行bolck内部的代码
}
(2)block作为类的成员属性
(3)block作为函数参数
(4)使用typedef定义block类型

浙公网安备 33010602011771号