1. 程式人生 > >iOS開發中block的寫法簡單整理

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