IOS Block 塊用法

hqman發表於2015-05-15

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

相關文章