block 在Objective-C 中使用的頻率還是非常高的,網(wǎng)上關于介紹block 的文章也非常多搭伤,本文旨在用最少民镜、最淺顯的語言介紹block。
block 是什么适肠?
block 在OC 中就是一個對象博其,但他的值是一段代碼,并且有返回值和入?yún)ⅰ?/p>
// 聲明數(shù)組
NSArray *array = @[@"a", @"b"];
// 聲明block
NSInteger (^sumNumbersBlock)(NSInteger a, NSInteger b) = ^(NSInteger a, NSInteger b) {
return a+b;
};
從表面上看迂猴,聲明數(shù)組和block 還是有很大不同的慕淡,但還是有一些相同點:
等號左邊命名部分:
NSInteger (^sumNumbersBlock)(NSInteger a, NSInteger b);
- 返回值:block 需要指定返回值,上面的代碼中返回值類型為
NSInteger
沸毁,如果什么都不返回峰髓,使用void
就可以了 - 類型+變量名稱:格式為:
(^blockName)
傻寂,其中^
表示對象類型為block,并用()
將^
和對象名稱包起來携兵。 - 參數(shù):如果參數(shù)為空疾掰,使用
()
,若不為空徐紧,像這樣寫(NSInteger a, NSInteger b)
静檬。
等號右邊賦值部分:
三部分:^
+ ( 參數(shù) )
+ { block 實現(xiàn)的邏輯代碼 }
void (^block)(NSInteger a, NSInteger b);
block = ^(NSInteger a, NSInteger b) {
// your code
};
block 應該注意的細節(jié):
- 局部變量:block 中修改局部變量時需要使用__block 修飾符,否則只能獲取但不能修改并级。
- 全局變量:block 中可以直接獲取并且修改拂檩,不需要任何修飾符。
- 循環(huán)引用:block 中的對象變量需要使用__weak 修飾符嘲碧,防止循環(huán)引用導致內(nèi)存泄露稻励。
- block 中的變量(除對象變量)在block 代碼塊之后發(fā)生變化,該變量在block 中也不會發(fā)生變化愈涩。
block 應用場景
- 回調(diào):block 作為屬性時望抽,可以直接將回調(diào)的代碼對block 進行賦值,相比delegate履婉,結(jié)構(gòu)更加簡單煤篙,代碼預讀起來也更加方便。
- 入?yún)ⅲ篵lock 可以作為方法的入?yún)⑹褂没偻龋梢杂行У姆蛛x業(yè)務模塊和功能模塊舰蟆,降低代碼的耦合。
- OC 鏈式編程:OC 中使用鏈式編程可以使用block 實現(xiàn)狸棍。