Objective-C Block

簡介

Block在我們的開發中是非常常見的,比如值得反向傳遞,我們定義一個Block,就可以完成,對我們編程非常的方便,那麼Block到底是從哪裏來的呢?他有哪些注意事項?

Block:其實就是一段代碼塊,也稱作閉包。Block是C語言提供的功能,Objective-C是基於C語言,自然Block也具有同樣的功能,同時更加強大。

Block使用

Block定義:返回值類型/方法 (^塊名稱)(參數的類型) = ^(參數類型 參數名){執行的操作} 。 例如:

//無返回值
void (^firstBlock)(int) = ^(int age){print("%d/n",age);}
//返回一個int類型的值
int (^firstBlock)(int) = ^(int age){return age+1;}

Block使用

1、反向傳值

  • 在需要(B)傳值的頁面定義Block
typedef void (^ReturnTextBlock)(NSString *showText);

@interface nickNameViewController : UIViewController

@property (nonatomic, copy) ReturnTextBlock returnTextBlock;

- (void)returnText:(ReturnTextBlock)block;

@end
  • 在需要傳值(B)控制器實現方法
- (void)returnText:(ReturnTextBlock)block {
    self.returnTextBlock = block;
}
- (void)viewWillDisappear:(BOOL)animated {
    //判斷Block是否存在,在使用的地方賦值
    if (self.returnTextBlock != nil) {
//賦值Block       self.returnTextBlock(self.inputTF.text);
    }
}
  • 在需要用值(A)頁面實現並調用
- (void)clickNickName{

    NickNameViewController *nickNameVC = NickNameViewController();

    [nickNameVC returnText:^(NSString *showText) {
        self.nickNameLabel.text = showText;
    }];
}

2、NSArray遍歷

一下方法是我經常用到的非常方便,拿出來晾一晾。

[array enumeratorObjectsUsingBlock:  
^(id obj, NSUInteger index, BOOL  *stop){  
    NSLog(@"%i-%@",index,obj);  
    //若終斷循環  
    *stop = YES;  
}];  

這個enumeratorObjectsUsingBlock:提供三個參數,每一個item 下表 是否結束便利。實際開發中還是挺方便的。

總結一下: Block作爲屬性,Block作爲方法參數還有作爲代理。

PS

Block作爲開發中的利器,那麼它的內部實現是什麼,還有在使用Block需要注意什麼,有哪些關鍵字可以讓我們方便的使用?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章