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