iOS開發中block的寫法簡單整理
約定:用法中的符號含義列舉如下:
-
return_type表示返回的物件/關鍵字等(可以是void,並省略)
-
blockName表示block的名稱
-
var_type表示引數的型別(可以是void,並省略)
-
varName表示引數名稱
1.1 Block宣告及定義語法,及其變形
(1) 標準宣告與定義
return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... }; blockName(var);
(2) 當返回型別為void
void (^blockName)(var_type) = ^void (var_type varName) { // ... };
blockName(var);
可省略寫成
void (^blockName)(var_type) = ^(var_type varName) { // ... };
blockName(var);
(3) 當引數型別為void
return_type (^blockName)(void) = ^return_type (void) { // ... }; blockName();
可省略寫成
return_type (^blockName)(void) = ^return_type { // ... };
blockName();
(4) 當返回型別和引數型別都為void
void (^blockName)(void) = ^void (void) { // ... };
blockName();
可省略寫成
void (^blockName)(void) = ^{ // ... }; blockName();
(5) 匿名Block
Block實現時,等號右邊就是一個匿名Block,它沒有blockName,稱之為匿名Block:
^return_type (var_type varName)
{ //... };
1.2 typedef簡化Block的宣告
利用typedef簡化Block的宣告:
-
宣告
typedef return_type (^BlockTypeName)(var_type);
-
例子1:作屬性
//宣告 typedef void(^ClickBlock)(NSInteger index); //block屬性 @property (nonatomic, copy) ClickBlock imageClickBlock;
-
例子2:作方法引數
//宣告 typedef void (^handleBlock)(); //block作引數 - (void)requestForRefuseOrAccept:(MessageBtnType)msgBtnType messageModel:(MessageModel *)msgModel handle:(handleBlock)handle{
...
1.3 Block的常見用法
1.3.1 區域性位置宣告一個Block型的變數
-
位置
return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... };
blockName(var);
-
例子
void (^globalBlockInMemory)(int number) = ^(int number){ printf("%d \n",number);
};
globalBlockInMemory(90);
1.3.2 @interface位置宣告一個Block型的屬性
-
位置
@property(nonatomic, copy)return_type (^blockName) (var_type);
-
例子
//按鈕點選Block @property (nonatomic, copy) void (^btnClickedBlock)(UIButton *sender);
1.3.3 在定義方法時,宣告Block型的形參
-
用法
- (void)yourMethod:(return_type (^)(var_type))blockName;
-
例子
UIView+AddClickedEvent.h
- (void)addClickedBlock:(void(^)(id obj))clickedAction;
1.3.4 在呼叫如上方法時,Block作實參
-
例子
UIView+AddClickedEvent.m
- (void)addClickedBlock:(void(^)(id obj))clickedAction{ self.clickedAction = clickedAction; // :先判斷當前是否有互動事件,如果沒有的話。。。所有gesture的互動事件都會被新增進gestureRecognizers中 if (![self gestureRecognizers]) { self.userInteractionEnabled = YES; // :新增單擊事件 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
[self addGestureRecognizer:tap];
}
}- (void)tap{ if (self.clickedAction) { self.clickedAction(self);
}
}