Block相關(guān)(一)

1.Block入門

Block是C語(yǔ)言的擴(kuò)充功能。簡(jiǎn)單的來(lái)說(shuō):Block就是帶有自動(dòng)變量(局部變量)的匿名函數(shù)。這個(gè)可以類比C語(yǔ)言的函數(shù)指針。Block有著靈活和強(qiáng)大的功能,而且不需要命名。Block其實(shí)就是一個(gè)代碼塊,把你想要執(zhí)行的代碼封裝在這個(gè)代碼塊里,等到需要的時(shí)候再去調(diào)用。那block是OC對(duì)象嗎?答案是肯定的。這里把學(xué)習(xí)Block的過(guò)程記錄下來(lái)。

1.1 Block的語(yǔ)法:

^ + 返回值類型 + 參數(shù)列表 + 表達(dá)式

上面就是典型的block語(yǔ)法規(guī)范,舉個(gè)簡(jiǎn)單例子:

^ NSInteger (NSInteger num1, NSInteger num2) {
            return num1 + num2;
        };// 一個(gè)返回num1 + num2 的簡(jiǎn)單block

當(dāng)然block語(yǔ)法可以省略,當(dāng)返回值或參數(shù)列表為void時(shí)就可以省略,例子如下:


        ^(int count){count++; };// 等價(jià)于 ^void (int count){ count++; };

        ^{printf("hello block");}; //等價(jià)于 ^void (void){ printf("hello block"); };
 

block語(yǔ)法還可以省略返回值類型,這是因?yàn)楸磉_(dá)式中含有return語(yǔ)句時(shí),其返回值類型必須與其一致,基于這種特性,我們可以省略返回值類型,簡(jiǎn)單樣例如下:

^(int count){ return count++; };// 等價(jià)于^int (int count){ return count++; };   
1.2 Block作為類型變量:

在C語(yǔ)言中,我們知道聲明一個(gè)函數(shù)指針的語(yǔ)法模式如下:

int func(int count) {
    return count++;
}

int (*funcPtr)(int) = &func;

同樣的,block的語(yǔ)法類似:

 int (^func)(int) = ^ (int count) {
                           return count++;
                      };

既然可以作為變量,那么用法就會(huì)非常靈活,我們可以在函數(shù)返回和使用block變量,可以將block作為函數(shù)參數(shù),實(shí)例如下:

      // 定義幾種類型的block
    typedef void (^blk_1) (void);
    typedef int (^blk_2) (void);
    typedef int (^blk_3) (int);
    
    // 1.作為函數(shù)返回;
    - (blk_1)func1 {
        return ^ {
            NSLog(@"block作為返回類型");
        };
    }
    //  2.作為參數(shù)
    
- (void)func2:(blk_3)blk {
    blk = ^ (int count){
        return count ++;
    };
}
1.3 blcok賦值

block的賦值

格式:block = ^返回值類型(參數(shù)列表){}

沒(méi)有參數(shù)沒(méi)有返回值

myBlock testBlock = ^void(){
     NSLog(@"test");
 };
 // 沒(méi)有返回值,void可以省略
myBlock testBlock1 = ^(){
     NSLog(@"test1");
 };
 // 沒(méi)有參數(shù),小括號(hào)也可以省略
 myBlock testBlock2 = ^{
     NSLog(@"test2");
 };

有參數(shù)沒(méi)有返回值

myBlock1 testBlock = ^void(NSString *str) {
      NSLog(str);
}
//省略void
myBlock1 testBlock = ^(NSString *str) {
      NSLog(str);
}

有參數(shù)有返回值

myBlock2 testBlock = ^NSString *(NSString *str) {
     NSLog(str)
     return @"hi";
}
//有返回值時(shí)也可以省略返回值類型
 myBlock2 testBlock2 = ^(NSString *str) {
     NSLog(str)
     return @"hi";
}

1.4 block作用

block是用來(lái)封裝一段代碼,這段代碼可以在任何時(shí)候調(diào)用

與C中指向函數(shù)的指針 類似處

block可以做為方法/函數(shù)的參數(shù)與返回值
block可以接收參數(shù)與返回值

與C中指向函數(shù)的指針 不同處

block是inline的,并且對(duì)局部變量是只讀的;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C語(yǔ)言的擴(kuò)充功能——“帶有自動(dòng)變量(即局部...
    SkyMing一C閱讀 2,455評(píng)論 6 18
  • Block基礎(chǔ)回顧 1.什么是Block? 帶有局部變量的匿名函數(shù)(名字不重要,知道怎么用就行),差不多就與C語(yǔ)言...
    Bugfix閱讀 6,909評(píng)論 5 61
  • 《Objective-C高級(jí)編程》這本書(shū)就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 10,105評(píng)論 10 69
  • 又一家曾經(jīng)占據(jù)頭條的由50位美女眾籌的咖啡館武漢CC美咖死了,北京的66位美女眾籌的Her Coffee也死了。作...
    布小姐閱讀 4,126評(píng)論 14 44
  • 2017.11.22 星期三 晴 這段時(shí)間一直在陪孩子親子閱讀,不僅僅給孩子養(yǎng)成了受益終生的好習(xí)...
    XuZiHan閱讀 175評(píng)論 0 0

友情鏈接更多精彩內(nèi)容