標籤:
Block介紹
Block在ios 4.0之後加入,並大量使用在新的ios api中。block是一個匿名的代碼塊,可以作為傳遞給其他對象的參數,並得到傳回值。從本質上講,block同其他普通的變數類似,只是其儲存的資料是一個函數體。Block不只是針對Objective-C的專利,而是一種可以應用於C、C++和OBjective-C的語言層面的新特性。通過使用block,開發人員可以將一段程式碼片段像某一個數值一樣當做參數傳遞給函數。同時,blocks也是Objective-C的一種對象,可以像其他對象一樣添加到NSArray或者NSDictionary等集合中。
- 塊文法,本質上是匿名函數。與函數指標很相似
- Block封裝了一段代碼,可以在任何時候執行
- Block可以作為函數參數或者函數的傳回值,而其本身又可以帶輸入參數或傳回值。
Block基本使用
1> 如何定義block變數
int (^sumBlock)(int, int); void (^myBlock)(); int (^myBlock)(int) = ^(int num){ return num *multiplier };
2> 如何利用block封裝代碼
^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); };
3> block訪問外面變數
* block內部可以訪問外面的變數
* 預設情況下,block內部不能修改外面的局部變數
* 給局部變數加上__block關鍵字,這個局部變數就可以在block內部修改
* 給局部變數加上static關鍵字,這個局部變數就可以在block內部修改
4> 利用typedef定義block類型
typedef int (^MyBlock)(int, int); // 以後就可以利用MyBlock這種類型來定義block變數 MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b) { return a - b; }; MyBlock b3 = ^(int a, int b) { return a - b; };
Block使用的細節和本質
1.block實際上是指向結構體的指標
2.編譯器會將block的內部代碼產生對應的函數
Block的記憶體管理
1.預設情況下, block的記憶體是在棧中
* 它不會對所引用的對象進行任何操作
2.如果對block做一次copy操作, block的記憶體就會在堆中
* 它會對所引用的對象做一次retain操作
* 非ARC : 如果所引用的對象用了__block修飾, 就不會做retain操作
* ARC : 如果所引用的對象用了__unsafe_unretained\__weak修飾, 就不會做retain操作
這裡有一篇個人比較喜歡的關於Block記憶體管理文章,有興趣研究的可以看看:Block 的記憶體管理
Block使用注意
1、在使用block前需要對block指標做判空處理。
不判空直接使用,一旦指標為空白直接產生崩潰。
if (!self.isOnlyNet) { if (succBlock == NULL) { //後面使用block之前要先做判空處理 return; } id data = [NSKeyedUnarchiver unarchiveObjectWithFile:[self favoriteFile]]; if ([data isKindOfClass:[NSMutableArray class]]) { succBlock(data,YES); }else{ succBlock(nil,YES); }}
2、使用方將self或成員變數加入block之前要先將self變為__weak
3、在多線程環境下(block中的weakSelf有可能被析構的情況下),需要先將self轉為strong指標,避免在運行到某個關鍵步驟時self對象被析構。
__weak __typeof(self)weakSelf = self;AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) { __strong __typeof(weakSelf)strongSelf = weakSelf; strongSelf.networkReachabilityStatus = status; if (strongSelf.networkReachabilityStatusBlock) { strongSelf.networkReachabilityStatusBlock(status); }};
Block使用情境
(待完成)
Block的妙用
(待完成)
利用Block實現鏈式編程
(待完成)
Block總結
(待完成)
iOS中Block使用探索