看了兩天的block。
網上是有非常多解說與教程,也有講得非常好的。這裡就主要解說下我的理解與收穫。歡迎拍磚。
所謂block。我覺得應該是乙個閉包函式。而閉包,就是說block以及內部全部的變數生命週期都在其呼叫函式的生命週期內。
它一被呼叫完畢,則會被立刻釋放。這裡不講執行機制,僅僅簡要地講基本的用法(這裡所講是基於arc的環境下)。
1、放在函式體內的block:生命週期:僅僅存在於函式體。與函式體內的區域性變數相似。
其定義方式跟函式還是非常相似的。為了簡便理解我們對照下block與函式的定義。先看一下最簡單的形式,無返回值帶參。先看block直接放在函式體內的形式:
函式:
- (void)printblock:(nsstring *)output
block直接放在函式體內的形式:
void(^printblock)(nsstring *) = ^(nsstring *output)
;
這裡能夠看到。我們的函式體一般形式是:
- (返回值) 函式名: (形參)...
呼叫形式是:[呼叫物件 函式名(形參)];
那我們放在函式體內的block定義則是:
返回值 (^ block名)( 形參 ) = ^( 形參 );
呼叫形式是 :block名(形參)。
這裡的block就相當於是乙個內嵌函式。
宣告與實現要同一時候放在一起。形式就非常像我們尋常使用的物件賦值一樣:id obj = ... ;
2、放在函式外的block。
即為類內部範圍內的全域性block。生命週期為整個類內部。
定義與用法都與上面一致,僅僅只是就像區域性變數與類變數一樣是否可被其它方法呼叫而已。為了更簡單明瞭我們能夠看一下這個**:
//普通方法定義
- (void)printblock:(nsstring *)output
//函式體外的block
void(^printblock)(nsstring *) = ^(nsstring *output)
;//block呼叫
- (void)printsomething
3、放在類定義標頭檔案的block。
可被例項物件擁有。生命週期為整個例項物件。
標頭檔案裡的定義(1):
typedef
void(^printblockclass)(nsstring *);
@inte***ce
blockclass : nsobject
@property (nonatomic, copy)printblockclass print;
@end
//或者在實現檔案裡:
//但這樣的實如今內部的block我也不知道有什麼卵用。實際應用不大。
@inte***ce
blockclass : nsobject
@end
標頭檔案裡的定義(2):
//與方式一的差別無非像是自己定義一種結構然後你再去使用一樣
@inte***ce
blockclass : nsobject
@property (nonatomic, copy) void(^printblockclass)(nssting *output);
@end
這樣的把block作為屬性的情況是比較多用於頁面傳值中。
關於block的使用另一下幾個注意點: 1、僅僅有在呼叫block的時候才會執行{}內部的**(就比方把block定義在函式體內不呼叫是不會執行的)。
2、在block的{}內部**中是對外部的變數能夠引用,但不能改變。假設試圖更改會產生乙個編譯器錯誤。除非你把想要更改的變數宣告時加上 __block關鍵字。 3、在block使用過程要注意不要產生迴圈引用。
關於迴圈引用(memory recycle)這裡有一篇文章寫得不錯。有興趣能夠看看:
ios學習之block初探
block是ios4.0 和mac osx 10.6以後引進的對c語言的拓展,用來實現匿名函式的特性。所謂匿名函式,也稱閉包函式。即同意建立乙個暫時的沒有指定名稱的函式。最經經常使用作 函式 callback 引數的值,當然也有其它使用方法。比方說作為乙個變數值來使用,詳細使用方法將在後面介紹。在i...
block初級使用
view類中 mainview.h typedef 這個是重新定義,typeof 是求型別 typedef void registerblock nsstring 定義 block property nonatomic strong registerblock registerblock mainv...
iOS storyBoard使用Block傳值
1.在方法裡面定義的block是儲存在棧區的,方法呼叫完畢之後block占用的記憶體就會被銷毀.如果需要在其他方法裡面使用該block需要把block定義成屬性,修飾成copy,這樣 就會把棧區的內容拷貝乙份到堆區.2.解決block的記憶體迴圈引用問題.當乙個物件對block持有所有權.在bloc...