1. 程式人生 > >iOS block初解

iOS block初解

外部 通過 oid 利用 封裝 lock 代碼塊 類型 ret

相信大家都明白 block 的重要性是毋庸置疑的,它本身封裝了一段代碼並將這段代碼當做變量,通過 block() 的方式進行回調。block的這種機制和 函數指針 非常像。而我的理解即是: block 就相當於是 有返回類型代碼塊

一、定義block

返回類型 (^block類型名稱) (block形參)

void (^myBlock)() = ^(){
    NSLog(@"---這是一個block---");
};

int (^sumBlock)(int, int) = ^(int a, int b) {
    return a + b;
};
就等同於:  
int a = 10;
的形式

拆開寫:
void (^ block)();
block = ^{
    NSLog(@"---這也是一個block---");
};

對比函數:
int sum(int a, int b)
{
    return a + b;
}

二、調用block

int c = sumBlock(10,10);

三、block訪問外部變量

  • block內部可以訪問外面的變量

    int a = 10;
    void (^ block)();
    block = ^{
        NSLog(@"a=%d",a);
    };
  • 默認情況下,block內部不能修改外面的局部變量

    int a = 10;
    void (^ block)();
    block = ^{
        a = 20;
    };      
    //這是錯誤的
  • 給局部變量加上__block關鍵字,這個局部變量就可以在block內部修改

    __block int a = 10;
    void (^ block)();
    block = ^{
        a = 20;
    };

四、利用typedef定義block類型

 typedef int (^myBlock)(int, int);
 myBlock block = ^(int a, int b) {
    return a + b;
 };
 

拆開寫:

typedef int (^myBlock)(int, int);
 myBlock block; 
 block = ^(int a, int b) {
    return a + b;
 };

iOS block初解