IOS Block 块用法

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

    原文作者:hqman
    原文地址: https://segmentfault.com/a/1190000002767795
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞