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