首先來了解下什么是Block
-
(1)Block是OC中的一種數(shù)據(jù)類型榴都,在iOS開發(fā)中被廣泛使用
(2)^是Block的特有標(biāo)記
(3)Block的實(shí)現(xiàn)代碼包含在{}之間
(4)大多情況下下面,以內(nèi)聯(lián)inline函數(shù)的方式被定義和使用
(5)Block與C語言的函數(shù)指針有些相似娘汞,但使用起來更加靈活
示例:
void(^demoBlock)() =^ {
NSLog(@"Block");
// 無參數(shù)上岗,無返回值
};
int(^sumBlock)(int, int) =^(int x, int y) {
return x +y;
// 有參數(shù)有返回值
};
-
格式說明:(返回類型)(^塊名稱)(參數(shù)類型) = ^(參數(shù)列表) {代碼實(shí)現(xiàn)};
如果沒有參數(shù)棉饶,等號后面參數(shù)列表的()可以省略
注意事項(xiàng):
1垦页、Block可以使用在定義之前聲明的變量
int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
}
i = 100;
myBlock();
- 注意:
1紊册、在定義Block時(shí)赋续,會在Block中建立當(dāng)前局部變量內(nèi)容的副本【也就是拷貝】男翰。
2、后續(xù)再對該變量的數(shù)值修改纽乱,不會影響B(tài)lock中的值蛾绎,所以上述代碼執(zhí)行結(jié)果是10.
3、如果想要在Block中保持局部數(shù)值的變化鸦列,需要用到__block
關(guān)鍵字
__block int i = 10;
void (^myBlock) () = ^{
NSLog(@"%d",i);
}
i = 100;
myBlock();
Block的使用要點(diǎn)
1租冠、Block可以被當(dāng)做參數(shù)直接傳遞?,在被當(dāng)做參數(shù)傳遞時(shí)薯嗤,Block同樣可以使用在定義之前聲明的局部變量
- ?注意:默認(rèn)情況下顽爹,Block外部的變量,在Block中是只讀的骆姐!
2镜粤、?如果要修改Block之外的局部變量捏题,需要使用__block
關(guān)鍵字,一般用不到__block
關(guān)鍵字肉渴,在塊代碼中可以修改成員變量的數(shù)值(比較少用)
3公荧、當(dāng)把一個對象傳遞進(jìn)Block的時(shí)Block會自動對對象的指針做強(qiáng)引用
4、用typedef定義一個Block的類型同规,便于在后續(xù)直接使用
typedef double(^MyBlock)(double, double);
// 下邊直接用定義的名字寫起來簡短許多
MyBlock area = ^(double x, double y) {
return x * y;
};
MyBlock sum = ^(double a, double b) {
return a + b;
}循狰;?
(1)typedef是關(guān)鍵字用于定義類型,MyBlock是定義的Block類型
(2)area券勺、sum分別是MyBlock類型的兩個Block變量盡管绪钥,typedef可以簡化Block的定義,但在實(shí)際開發(fā)中并不會頻繁使用typedef關(guān)鍵字
這是因?yàn)锽lock具有非常強(qiáng)的靈活性朱灿,尤其在以參數(shù)傳遞時(shí)昧识,使用Block的目的就是為了立即使用
- 關(guān)于Block的循環(huán)引用問題
@property (nonatomic,strong)NSMutableArray * myBlocks;
#pragma mark
int (^sum)(int ,int) = ^(int x,int y){
return [self sum:x y:y];
};
[self.myBlocks addObject:sum];
代碼導(dǎo)圖.jpg
-
解決循環(huán)引用的辦法
代碼導(dǎo)圖.jpg - 下一篇文章將介紹如何把按鈕的點(diǎn)擊事件用Block傳遞出去