Objective-C中的Block(閉包)

青玉伏案發表於2015-12-18

學習OC有接觸到一個新詞Block(個人感覺又是一個牛氣沖天的詞),但不是新的概念,不是新的東西。學過Javascript的小夥伴對閉包應該不陌生吧~學過PHP的應該也不陌生,在PHP5.3版本以後也支援閉包, 也就是OC中所提到的Block。 到底什麼是閉包或者block呢?用大白話說就是匿名函式,也就是在函式中可以包含這函式。就是在函式中可以定義匿名函式然後在函式中呼叫。學習OC中的block之前也小擔心一下,Block在OC中屬於高階的部分,心裡有又有個疑問:學起來難不難?看過Block的部分,感覺Block挺好理解的,用起來也挺順手的,Block沒我想象中的那麼難理解。

廢話少說,學習一門新的程式語言是少不了程式碼量的支援的,所以程式碼是少不了的。下面就通程式碼來認識一下OC中的block的使用。

Block基礎部分

1.Block的宣告

Block的定義和函式的宣告差不多,就是把函式名改成(^blockName)即可。下面是block宣告的程式碼。

有返回值的

無返回值的

2.給block塊賦值

給宣告好的block,賦值。block的值就是個函式體,給block塊賦值有兩種方式,一個在宣告的時候賦值,一個是先宣告在賦值。

先宣告再賦值

在宣告的時候賦值

3.呼叫block

block的使用和普通函式的使用相同,呼叫方法如下:

4.把block當做引數傳入函式

5.在程式碼塊中使用區域性變數和全域性變數

在block中可以和對全域性變數進行訪問和修改,但對區域性變數只可以訪問,若想修改的話,我們可以在宣告區域性變數的時候加上關鍵字__block

程式碼如下:

Block進階 參考部落格:http://www.cnblogs.com/NarutoYq/

下面的這些內容是參考上面的部落格進一步學習的Block的內容,程式碼是參考這上面的部落格自己寫的,也就是說下面的東西算是偽原創吧。小夥伴們如果沒大看懂下面的東西,請去上面的部落格中進一部的瞭解一下block.

1.區域性變數可變物件和不可變物件在block中的引用

下面會提供一部程式碼,這部分程式碼的功能是定義兩個區域性變數,一個是可變物件,一個是不可變物件,然後再定義一個Block, 在block中引用兩個區域性變數。上面提到了在程式碼塊中可以引用區域性變數但是不可以更改其值,除非在宣告的時候加上__block關鍵字。

測試程式碼如下:

程式碼說明:給定義的各一個可變和不可變的物件一個初始值,然後在呼叫程式碼塊的時候修改兩個區域性變數的值,然後再程式碼塊中顯示變數的值。

執行結果如下:

從上面的輸出結果我們可以看到,在程式碼塊中輸出的不可變物件是原有的值,而不是我們改後的值,地址也是初始的地址。而對於可變物件,值是我們修改後的值,而地址使用原有的地址。如果要想block和不可變區域性變數繫結的話,我們要加上_block

還是引用上面部落格中的一段話來做一下總結吧:

  1. 對值型別的修改,如果block初始化後,無法同步到block內部

  2. 對於引用型別的修改,如果block初始化後,修改指標指向,即指向另外一塊記憶體,這樣也是無法同步到block內部

  3. 對於引用型別的修改,如果block初始化後,對指標指向的記憶體進行修改,即NSMutableArray add 、remove操作,這樣是可以用同步到block內部,但block內部同樣無法修改。

2.成員變數在block中的使用

成員變數在block中的使用是加上self->a使用的,所以在宣告成員變數的時候加不加__block,在成員函式中的程式碼塊中都可以訪問修改;

​程式碼走起:

​interface:

​方法的實現:

輸出結果:

總結:

  1. 對於一個、多個成員變數,不管是否用__block修飾(用不用都沒任何影響),block結構體會生成一個成員 :self,並且會引用成員變數所屬的物件例項 self。

  2. 對於成員變數的修改都是通過物件self指標引用來實現的。

  3. block內部對於成員變數的訪問也是通過block結構體物件的成員self 指標引用來實現的。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

Objective-C中的Block(閉包)

相關文章