block的基本使用

一 Block基本常識

1.聲明block
聲明沒有參數(shù)沒有返回值block
void(^block1)(); block1就是該block數(shù)據(jù)類型的變量名
有返回值有參數(shù)
int(^block2)(int);

2.定義block
2.1 沒有參數(shù),沒有返回值block的定義

      void(^block1)() = ^{  };

2.2 有參數(shù),有返回值block的定義

  int(^block2)(int) = ^int(int a){ return a  };     ==    int(^block2)(int) = ^(int a){ return a  };   
 = 后面的返回值類型可以省略     
 注意:如果block有返回值,那么代碼塊中一定要有return

3.block作用
封裝(保存)代碼塊

4.block調(diào)用
用變量名+()就可以調(diào)用
如果有參數(shù),()內(nèi)一定要寫上 參數(shù)的變量名

5.block類型
block的數(shù)據(jù)類型去掉變量名 就是 block的類型

 例如:void(^block1)()的block類型為   void(^)()
          int(^block2)(int)的Block類型為 : int(^)(int)

6.生成block類型的快捷方式
輸入inline + 回車 就會彈出block類型的定義模板

  <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {        <#statements#>
};
 注意:蘋果文檔里面說明block是一個對象
 ![](http://upload-images.jianshu.io/upload_images/2557720-b88ff91594815aa0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

二 block的使用場景

1.block可以作為方法的參數(shù)去使用
1.1 為什么把block作為參數(shù)使用?
封裝一個類,有些事情方法內(nèi)部不能決定,需要外界決定,那么可以提供block給外界 , 通過block外界就可以把想做的事情傳進來
經(jīng)典案例:動畫 和 AFN發(fā)送網(wǎng)絡(luò)請求

  動畫:  UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>
     [UIView animateWithDuration:2.0 animations:^{
         //在這里寫(外界)想做的事情
     }];
AFN: 
mgr GET:<#(nonnull NSString *)#> parameters:<#(nullable id)#> progress:<#^(NSProgress * _Nonnull      downloadProgress)downloadProgress#> success:<#^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)success#> failure:<#^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)failure#>

[mgr GET:XMGBaseUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        
//這里寫(外界)想做的事情        
//參數(shù)的作用:內(nèi)部得到的數(shù)據(jù),想要傳給外界,就可以通過block的參數(shù)來傳遞                            
//內(nèi)部對參數(shù)賦值,在外界通過這個參數(shù)  就能夠拿到這個值    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        
//這里寫(外界)想做的事情
}];

2.block作為成員變量使用

為什么把block作為成員變量:一個類中,有些事情需要外界來決定,就可以提供一個block成員變量,外界通過對blcok賦值,就能把想做的事情傳進來

不帶參數(shù)的block成員變量

聲明   @property (nonatomic, copy)void(^task)();

給block賦值 (set方法)

  XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兌換碼" subTitle:nil];
  item1.task = ^{       
 UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"清理緩存" message:@"幫你清理12M" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];        
[alertV show];
  };

帶參數(shù)的block成員變量

聲明   @property(nonatomic,copy) void(^task)(NSIndexPath *indexPath) ;

給block賦值 (set方法)

  XTSettingArrowItem *item1 = [XTSettingArrowItem rowItemWithImage:nil title:@"使用兌換碼" subTitle:@"23:00"];
item1.task= ^(NSIndexPath *indexPath){
    UITextField *textF = [[UITextField alloc] init];        
[textF becomeFirstResponder];        
//添加到當(dāng)前點擊的Cell上.        
//獲取當(dāng)前點擊的是哪個Cell.        
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell addSubview:textF];
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 Block概述 Block定義方式 Block保存代碼 Block傳值 Block對外部變量的傳遞 Bloc...
    子斌閱讀 1,496評論 2 7
  • 1.Block代碼塊的基本使用 Block的作用Block主要用來保存一段代碼Block可以封裝一段代碼,這段代碼...
    斷劍閱讀 899評論 1 3
  • 例行科普 Block 是 iOS4 之后添加的一種語法結(jié)構(gòu),也成為閉包,或者匿名函數(shù),在iOS開發(fā)過程中應(yīng)用較多,...
    CJ_BLUE閱讀 921評論 0 1
  • 通過這幾天大家的反饋,感覺大家對Block和內(nèi)存泄漏的呼聲很高,本來想這次寫runtime在實際項目中的用法,不過...
    鍵盤風(fēng)箏閱讀 1,956評論 0 16
  • Block 釋義:匿名的函數(shù)、代碼塊(把你想要執(zhí)行的代碼封裝在這個代碼塊里,等到需要的時候再去調(diào)用),是蘋果在 i...
    ibiaoma閱讀 550評論 0 1

友情鏈接更多精彩內(nèi)容