block在苹果app开发中广泛应用,如http请求回调,GCD并发执行等。
基本用法
定义
//定义一个本地变量的 block
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};
//简化定义
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {...};
//例子
//定义
void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){
NSLog(@" %@ ",obj);
};
//使用
BOOL stop;
MyBlock(@"ttt",1,&stop);
//作为方法参数
NSArray *citys=@[@"suzhou",@"hangzhou"];
[citys enumerateObjectsUsingBlock:MyBlock];
//内联用法
[citys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@" %@ ",obj);
}];
访问上下文的能力
可以自由访问定义块方法栈内变量和堆变量,还有全局变量
__block 可直接引用变量可以修改
// 本地变量
NSString *lived=@"suzhou"
__block int count=0;
void (^MyBlock)(id,NSUInteger ,BOOL*)=^(id obj,NSUInteger idx ,BOOL *stop){
NSString *city=(NSString *)obj;
if([city isEqualsToString:lived){
NSLog(@" i live in %@ ",obj);
}else{
NSLog(@" %@ ",obj);
}
count++;
};
//此时count=2
NSArray *citys=@[@"suzhou",@"hangzhou"];
[citys enumerateObjectsUsingBlock:MyBlock];
高级用法
block本质上是一个oc对象,所以可以存放在对象属性里面,在对象其他方法中来访问。
// 定义block类型
typedef int (^MathBlock)(int, int);
// 定义一个 mathblock 属性
@property (strong) MathBlock mathBlock;
// 设置block
- (void)doMathWithBlock:(MathBlock) mathBlock {
self.mathBlock = mathBlock;
}
// 触发 设置block 事件
- (IBAction)buttonTapped:(id)sender {
[self doMathWithBlock:^(int a, int b) {
return a + b;
//block 引用了 self self引用了block 内存泄露了
//__weak typeof(self) weakSelf = self;
//self.done();
weakSelf.done();
}];
}
-(void) done{
NSLog(@"do math done");
}
// 调用block
- (IBAction)button2Tapped:(id)sender {
self.label.text = [NSString stringWithFormat:@"%d", self.mathBlock(3, 5)];
}
参考:
http://www.raywenderlich.com/9438/how-to-use-blocks-in-ios-5-tutorial-…