1.Block代碼塊的基本使用
-
Block的作用
- Block主要用來(lái)保存一段代碼
- Block可以
封裝
一段代碼,這段代碼可以在任何時(shí)候調(diào)用執(zhí)行
Block能夠
作為
函數(shù)的參數(shù)
或者函數(shù)的返回值
招盲,Block自已也可以包含
參數(shù)和返回值定義Block語(yǔ)法格式
^(block 返回值類型)(參數(shù)類型:參數(shù)1,參數(shù)類型:參數(shù)2,...)
{
//block 執(zhí)行代碼
}
注意
- Block 必須以 ^ 開(kāi)頭---- ^ block 的標(biāo)志
- Block 返回值類型可以省略
- Block 不用指定名字
- 沒(méi)有參數(shù)時(shí)候低缩,參數(shù)部分( )不能省略,一般使用void
- 定義Block變量
block返回值類型 (^ block 變量名)(參數(shù)類型1,參數(shù)類型2,...);
** 注意 **
聲明block變量曹货,只需要指定參數(shù)類型
** 注意區(qū)分 Block 塊和 Block 塊變量咆繁,我們是將 Block 塊賦值給Block 塊變量 **
- Block與函數(shù)
保存代碼;有返回值顶籽;有形參玩般;調(diào)用方式一樣
//1.沒(méi)有返回值,沒(méi)有形參
void (^ printBlock)(void) = ^{
NSLog(@"printBlock");
};
printBlock();//注意調(diào)用的時(shí)候礼饱,不要忽略( )
//2.有參數(shù)坏为,有返回值
int(^printTest)(int ,int) = ^(int a, int b){
return a * b;
};
NSLog(@"%d",printTest(3,3));
//3.
void(^print)(NSString * str);
print = ^(NSString * str){
NSLog(@"%@",str);
};
print(@"block其實(shí)沒(méi)有那么難");
void(^printA)(int) = ^(int a)
{
NSLog(@"-------");
};
printA(5);
- 我們可以先定義塊變量,再對(duì)塊變量進(jìn)行賦值镊绪;也可以定義塊變量的同時(shí)對(duì)塊變量賦值
- 注意書(shū)寫(xiě)block時(shí)久脯,最好先寫(xiě)block代碼塊屈尼,再寫(xiě)block變量
2.Block與局部變量
- Block能夠
訪問(wèn)
局部變量的值 - Block
改變
局部變量的值躁倒,必須給局部變量加上__block修飾符
int num = 25;
void (^printNum)(void) = ^(void)
{
NSLog(@"%d",num);
};
num = 35;
printNum();
//程序輸出的是25破托,而不是35
- 在使用block訪問(wèn)局部變量的時(shí)候鸠天,當(dāng)我們定義block的時(shí)候弛针,就會(huì)把局部變量的值保存在block中樟结,并不是當(dāng)我們調(diào)用block的時(shí)候才去獲取局部變量的值
__block int num = 25;
void (^printNum)(void) = ^(void)
{
num = 40;
NSLog(@"%d",num);
};
num = 35;
printNum();
//程序輸出的是40
- 當(dāng)我們使用__block修飾局部變量:任何時(shí)候无蜂,程序都是直接訪問(wèn)局部變量本身喇完,不是將局部變量的值賦值到block范圍內(nèi)
block內(nèi)部直接修改局部變量報(bào)錯(cuò)
3.Block作為方法的參數(shù)
- 當(dāng)我們把block用作方法的參數(shù)時(shí)牢硅,不用定義block變量蹬耘,直接將block作為參數(shù)傳遞給相應(yīng)方法就可以
- 蘋(píng)果官方建議block通常作為最后一個(gè)參數(shù)
4.typedef定義block變量
作用
復(fù)用blcok變量類型,重復(fù)定義多個(gè)block變量
使用block類型定義函數(shù)參數(shù)
格式
typedef block返回值類型 (^block變量類型)(參數(shù)類型1 參數(shù)名减余,參數(shù)類型2综苔,參數(shù)名)
//使用typedef定義塊變量類型
typedef void (^ZZYPrint)(NSString * str);
//使用ZZYPrint定義塊變量,并將指定block代碼塊賦值給該變量
ZZYPrint print1 = ^(NSString * str){
NSLog(@"%@",str);
};
ZZYPrint print2 = ^(NSString * str)
{
NSLog(@"%@",str);
};
print1(@"print1");
print2(@"print2");
//利用typedef定義的塊變量類型即可為函數(shù)聲明塊變量類型的形參,要求傳入?yún)?shù)時(shí)必須傳入塊變量