Block 是OC的一種語(yǔ)法,其用法如下:
//使用block需要注意的問(wèn)題:
//1.聲明block類型的屬性時(shí)懂拾,修飾的關(guān)鍵詞 copy
//2.block要避免閉環(huán)強(qiáng)引用
1.block的聲明
2.block的實(shí)現(xiàn)和賦值
3.block的調(diào)用
4.block作為函數(shù)的參數(shù)
5.block作為函數(shù)的返回值
Swift中聲明閉包: var closure:((參數(shù)名:參數(shù)類型,參數(shù)名2:參數(shù)類型,...)->(返回值類型1,返回值類型2,...)) ={(參數(shù)名1,參數(shù)名2,...) in 閉包體 }
//如果回調(diào)只有一種或兩種情況的時(shí)候控漠,使用block進(jìn)行回調(diào)比較方法叙身,如果有多種回調(diào)情況的正勒,采用協(xié)議代理
//1.聲明block的變量 : 返回值(^block變量名)(參數(shù)類型1 參數(shù)名,參數(shù)類型2 參數(shù)名); 聲明時(shí)缺谴,參數(shù)名可以省略捶箱,但是不推薦省略
void(^blockName)(NSString * str,BOOL success);
//省略參數(shù)的寫法:void(^blockName1)(NSString *,BOOL);
//2.block的實(shí)現(xiàn)和賦值
blockName = ^(NSString * str,BOOL success){
//block的實(shí)現(xiàn)部分酿矢,block體
//聲明和賦值時(shí),block體中的代碼都不會(huì)執(zhí)行
NSLog(@"執(zhí)行blokc體中的代碼");
};
//3.調(diào)用block
blockName(@"bwrgrets",YES);
//4.block作為函數(shù)的參數(shù)
這個(gè)有兩種方式實(shí)現(xiàn):
第一種:提前聲明一個(gè)Block ,然后調(diào)用
第二種: 函數(shù)調(diào)用的時(shí)候,直接聲明和實(shí)現(xiàn)
# if true
// 第一種實(shí)現(xiàn)方式: 提前聲明一個(gè)block 函數(shù)實(shí)現(xiàn)
int(^useBlock)(NSString *) = ^(NSString * str){
NSLog(@"調(diào)用blokc str = %@",str);
return 0;
};
//調(diào)用函數(shù)
[self useAblock:useBlock];
#else
// 第二種實(shí)現(xiàn)方式
[self useAblock:^int(NSString *str) {
NSLog(@"str = %@",str);
return 1;
}];
#endif
//使用一個(gè)block作為參數(shù)的方法
-(void)useAblock:(int(^)(NSString * str))block{
//回調(diào)傳遞過(guò)來(lái)的block
block(@"sdkjhvgkew");
}
//5:block作為函數(shù)的返回值 (不經(jīng)常使用)
// 用一個(gè)變量接受一下 函數(shù)返回值
void(^getBlock)() = [self returnABlock];
//調(diào)用返回的block
getBlock();
// 返回一個(gè)block 的函數(shù)
-(void(^)())returnABlock{
/*
// 第一種方式, 定義一個(gè)block
void(^returnBlock)() = ^{
NSLog(@"被返回的block被調(diào)用");
};
return returnBlock;
*/
// 直接返回定義和返回
return ^{
//直接返回
NSLog(@"被返回的block被調(diào)用");
};
}
附加
//采用self.myBlock 對(duì)block屬性賦值垦江,myBlock聲明時(shí)內(nèi)存相關(guān)的關(guān)鍵詞是 copy ,所有調(diào)用setter方法是帽馋,self對(duì)block實(shí)現(xiàn)部分進(jìn)行了一次強(qiáng)引用
//解決閉環(huán)強(qiáng)引用:讓block對(duì)當(dāng)前對(duì)象的引用變成弱引用,用一個(gè)當(dāng)前類的弱引用類型指針pName指向self,在block體中使用pName去代替self
__weak NewViewController *pName = self;
__unsafe_unretained NewViewController * p = self;
//__weak 修飾,對(duì)象被釋放之后比吭,pName會(huì)被置為nil,不會(huì)造成野指針绽族,比較安全,只能在ARC環(huán)境中使用
//__unsafe_unretained修飾衩藤,對(duì)象被釋放之后吧慢,p不會(huì)置為nil,會(huì)造成野指針,可能會(huì)造成程序崩潰赏表,ARC/MRC環(huán)境中都能使用