约定:用法中的符号含义列举如下:
-
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);
}
}