一.block的簡(jiǎn)單使用
1.block聲明
block變量的聲明格式為: 返回值類型 (^block名字)(參數(shù)列表);
- 聲明一個(gè)無返回值,有兩個(gè)NSString參數(shù),名字為ablock的block
void (^ablock)(NSString * str1,NSString * str2);
- 形參變量名可以省略,只留下形參類型
void (^ablock)(NSString * ,NSString * );
2.block賦值
block的賦值格式為: ablock變量=^(參數(shù)列表){函數(shù)體} ;
//1.在此先聲明一個(gè)名為ablock的block
void (^ablock)(NSString * str1,NSString * str2);
//2.在此將等號(hào)右邊的block代碼塊的實(shí)現(xiàn)賦值給ablock變量
ablock = ^(NSString * str1,NSString * str2){
NSLog(@"%@,%@",str1,str2);
};
//3.在這里調(diào)用ablock
ablock(@"lisj",@"ddsd");
block 賦值格式
block變量=^返回值類型(參數(shù)列表){函數(shù)體};
- 其中,返回值類型可以書省略,因?yàn)榫幾g器可以根據(jù)存儲(chǔ)代碼塊的變量中,確定返回值的類型.
3. 在聲明block的同時(shí)對(duì)其進(jìn)行賦值
簡(jiǎn)化block的聲明和定義的過程,一步到位,直接調(diào)用即可
//1.聲明block,并定義
int (^myblcok) (int,int) = ^ (int c,int d){
return c*d;
};
//2.有參數(shù)有返回值的block調(diào)用
NSLog(@"%d", myblcok(4,5));//這里會(huì)在控制臺(tái)打印20
如果沒有參數(shù)列表,賦值時(shí),參數(shù)列表可以省略
//1.無返回值無參數(shù)block的聲明及定義
void (^oneblcok) () = ^ {
NSLog(@"hello world ");//打印hello world
};
//2.無參,無返回值block的調(diào)用
oneblcok();
二.block的進(jìn)階使用
1.block作為C函數(shù)參數(shù)
第一種語法
//1.聲明一個(gè)求和函數(shù)
void useBlockInC(int (^block)(int a ,int b)){
NSLog(@"%d",block(30,30));
}
//2.定義一個(gè)block,用來實(shí)現(xiàn)求和的功能(主要邏輯部分,根據(jù)自己的需求在這里寫代碼)
int (^addBlock)(int,int )=^(int x,int y){
return x+y;
};
//3.調(diào)用函數(shù)
useBlockInC(addBlock);
-
第二種語法(第一種的簡(jiǎn)化版--常用)將第一種語法中的第2步和第3步結(jié)合起來,簡(jiǎn)化語法
//1.聲明一個(gè)求和函數(shù)(第一步相同)
void useBlockInC(int (^block)(int a ,int b)){
NSLog(@"%d",block(30,30));
}
//
//簡(jiǎn)化,把2和3結(jié)合起來,簡(jiǎn)化之后如下方式
//示例1
useBlockInC(^int(int a, int b) {
return a*b;//這里的代碼邏輯根據(jù)項(xiàng)目需求寫,可靈活多變,只要符合語法
});
//示例2
useBlockInC(^int(int a, int b) {
return a-b;//比如變成減法
});
- block用作函數(shù)參數(shù),相當(dāng)于傳進(jìn)來了一種數(shù)據(jù)類型,可以拿到相應(yīng)的參數(shù)來做自己想做的事.
- block一般用作函數(shù)參數(shù)時(shí),多為無返回值類型.
2.block作為OC函數(shù)參數(shù)
第一種語法
//1:寫自己需要用到block做參數(shù)的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
block(@{@"name":@"myName is bob"});
}
//2:聲明一個(gè)block變量,并把具體的代碼塊賦值給block變量
void (^dicBlock) (NSDictionary *) = ^(NSDictionary * dic){
for (NSString * item in dic)
{
NSLog(@"%@",item);
}
};
//3:調(diào)用函數(shù),將block當(dāng)做參數(shù)傳入函數(shù)
[self useBlockInOC:dicBlock];
-
第二種語法簡(jiǎn)化版(第二步和第三步合并)
//1:寫自己需要用到block做參數(shù)的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
block(@{@"name":@"myName is bob"});
}
//2.調(diào)用函數(shù),代碼塊內(nèi)寫邏輯代碼
[self useBlockInOC:^(NSDictionary *dic) {
NSLog(@"%@", [dic objectForKey:@"name"]);
}];
3. 使用typedef 定義block類型,可以簡(jiǎn)化block在C中的使用
//第一步,使用typedef聲明block類型typeBlock
typedef void (^typeBlcok) (NSArray *);
//第二步,創(chuàng)建一個(gè)block的變量,并把block的代碼塊賦值給這個(gè)新創(chuàng)建的變量
typeBlcok newBlcok =^(NSArray * arr){
for (id item in arr) {
NSLog(@"%@",item);
}
};
//第三步:調(diào)用block,記得傳入?yún)?shù)
NSArray * arr=@[@"戰(zhàn)狼2",@"吳京",@"敦刻爾克",@"蜘蛛俠",@"極限挑戰(zhàn)",@"美麗的五險(xiǎn)",@"你好,佳人",@"成語大會(huì)",@"創(chuàng)業(yè)故事"];
newBlcok(arr);//調(diào)用block
4.使用typedef簡(jiǎn)化block在OC中的使用方法
- 第一種語法
//1.使用typeBlock聲明一種block的類型,簡(jiǎn)化block的用法
typedef void(^typeBlock) (NSDictionary * dic);
//2.寫自己需要的函數(shù)
-(void)useBlockInOC:(void (^)(NSDictionary * dic))block{
block(@{@"name":@"myName is bob"});
}
//3.用聲明的typeBlock類型創(chuàng)建一個(gè)block變量,然后把具體的代碼塊賦值給對(duì)象
typeBlock block = ^(NSDictionary *dic) {
NSLog(@"%@", [dic objectForKey:@"name"]);
};
//4.調(diào)用函數(shù),將block當(dāng)做參數(shù)傳入函數(shù)
[self useBlockInOC:block];
- 第二種語法
//1.使用typeBlock聲明一種block的類型,簡(jiǎn)化block的用法
typedef void(^typeBlock) (NSDictionary * dic);
//2.寫自己需要的函數(shù)
-(void)useBlockInOC2:(typeBlock)block{
block(@{@"name":@"myName is bob"});
}
//3.調(diào)用函數(shù),簡(jiǎn)化版,代碼塊內(nèi)直接寫邏輯代碼
[self useBlockInOC:^(NSDictionary *dic) {
NSLog(@"%@", [dic objectForKey:@"name"]);
}];
解釋:無論是C語言或者是OC語言,第二種語法最常用.第一種語法可以看做是第二種語法的來源或者原理