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-…