閉包和OC的block的本質

「閉包」 一詞來源於如下二者的結合:要執行的代碼塊(因爲自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和爲自由變量提供綁定的計算環境(做用域)。objective-c

http://blog.csdn.net/yxwlzsh/article/details/46882119算法

第一部分: 理論

什麼是閉包

計算機語言中、「閉包(Closure)是由函數和與其相關的引用環境組合而成的實體.」 block就是OC對閉包的實現.(很抽象有木有), Block是iOS4.0+ 和Mac OS X 10.6+ 引進的對C語言的擴展.數據結構

將「函數、函數指針、閉包」三者對比起來理解,能加深對閉包的理解: 
函數: 具備特定功能的代碼塊; 
函數指針: 指向函數的指針; 
閉包:除具有「函數和函數指針」的全部功能外, 還包括聲明它的上下文(如做用域內的自由變量等).多線程

閉包的用途

維基百度科說了3點:閉包

  1. 「惰性求值」特性可用做定義控制語句;
  2. 多函數使用同一個環境;
  3. 實現對象系統.

哈哈,除了第二點,其它兩點暫時體會不到, OC中主要體現也是第二點,有時候這種結構顯得很是簡潔直觀. 網上一些其它說法:併發

一般來講,block都是一些簡短代碼片斷的封裝,適用做工做單元,一般用來作併發任務、遍歷、以及回調。函數

閉包的實現

「典型實現方式是定義一個特殊的數據結構,保存了函數地址指針與閉包建立時的函數的詞法環境(also lexical closures or function closures)。」.net

block的種類

Objective-C語言中,一共有3種類型的block: 
_NSConcreteGlobalBlock 保存在text段的全局的靜態block,不會訪問任何外部變量。 
_NSConcreteStackBlock 保存在棧中的block,當函數返回時會被銷燬。 
_NSConcreteMallocBlock 保存在堆中的block,當引用計數爲0時會被銷燬。線程

block的使用注意事項

    1. 在block內直接調用類的實例變量會使self(類的實例)引用計數加1, 這樣可能會引發循環引用問題(能夠用__weak或local-var處理);
    2. 使用null的block程序會crash. 使用前判斷一下:if(blockVar) {//do something…};
    3. 在多線程環境下(block中的weakSelf有可能被析構的狀況下),須要先將self轉爲strong指針,避免在運行到某個關鍵步驟時self對象被析構。
相關文章
相關標籤/搜索