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);
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_32283541/article/details/85861804