Block深層剖析(一)

"Block"這個詞既指源代碼中的block語法,也指由block語法所生成的“值”。

1.Block的本質

首先你要知道Block是一個對象(為什么說block是一個對象呢,下面會有解釋。),Block的本質其實就是閉包功能在iOS上的實現(xiàn)。

  • 那什么是閉包呢?

(以下解釋來自百度百科)
閉包就是能夠讀取其他函數內部的函數,也可以理解為“定義在函數內部的函數”。本質上,閉包是函數內部和函數外部連接的橋梁。

我們來具體解釋一下這句話:
我們都知道變量的作用域有全局變量和局部變量,在一個函數中我們可以訪問全局變量和定義在這個函數中的局部變量,但是在這個函數外部就不能夠訪問該函數中的局部變量了。
有什么方法可以在函數的外部訪問到該函數內的局部變量呢? 這里就用到了“閉包”。
寫一段代碼感受一下吧。

- (void(^)(void))fun1{
    int a = 100;
    return ^{NSLog(@"a = %d",a);} ;
}
// 調用fun1
[self fun1];

這樣可以在函數fun1外部 訪問函數fun1內部的變量a了。我們發(fā)現(xiàn)定義在fun1函數內部的這個函數沒有名字,所以閉包還有另一種說法叫做:

“帶有自動變量值的匿名函數?!?/p>

2.Block語法

下面介紹一下Block表達式語法

  • 完整語法
^ 返回值類型 (參數列表){表達式}
^ int (int count) { return count +1;};
  • 省略返回值類型
^ (參數列表) {表達式}
^ (int count){printf("%d",count);}
  • 省略返回值類型 和 參數列表
^ {表達式}
^ {printf("BLOCK!!!”);}

3. Block用法

3.1. Block作為屬性

定義了一個 名為blockName的成員屬性

@property (nonatomic, copy) void(^blockName)(NSString *);

3.2. Block作為方法參數

// 定義方法
- (void)testBlock:(void(^)(NSString * blockParam))callBack{
    callBack(@"在方法中 調用了block");
}
// 調用方法
 [self testBlock:^(NSString *blockParam) {
     NSLog(@"block回調 到這里了 -- %@",blockParam);
  }];

3.3. Block作為方法返回值

- (void(^)(NSString * blockParam))blockAsRetrunValue{
    
    void(^blockName)(NSString*) = ^(NSString * param) {
        NSLog(@"%@",param);
    };
    return blockName;
}

結束語:以上是我在看《Objective-C高級編程 iOS與OS X多線程和內存管理》這本書對Block的總結。有不足的地方,歡迎指正。

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

相關閱讀更多精彩內容

  • 1. python函數: 函數是組織好的,可重復使用的,用來實現(xiàn)單一,或相關聯(lián)功能的代碼段 函數能提高應用的模塊性...
    freedom_smile閱讀 1,064評論 0 1
  • 前言 閉包是JS中重要的內容,對大多數人來說都會覺的閉包本身很好理解,不就是一個函數嵌套一個函數嗎?但是再深入解釋...
    蛙哇閱讀 1,080評論 0 1
  • 函數是組織好的,可重復使用的,用來實現(xiàn)單一,或相關聯(lián)功能的代碼段。 函數能提高應用的模塊性,和代碼的重復利用率。你...
    Java丶python攻城獅閱讀 507評論 0 1
  • # 函數(2) ## 1.函數類型 函數也是一種類型,我們自定義的函數就是函數對象,函數名保存了函數對象的引用(...
    取個名字怎么就這么難呢閱讀 243評論 0 0
  • 推薦指數: 6.0 書籍主旨關鍵詞:特權、焦點、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學現(xiàn)在叫數據分析,社會...
    Jenaral閱讀 5,981評論 0 5

友情鏈接更多精彩內容