Block是iOS中一種比較特殊的數(shù)據(jù)類型焊傅。
Block是蘋果官方特別推薦使用的數(shù)據(jù)類型揩页,應(yīng)用場(chǎng)景比較廣泛:
·動(dòng)畫
·多線程
·集合遍歷
·網(wǎng)絡(luò)請(qǐng)求回調(diào)
Block作用:
·用來保存一段代碼肋拔,可以在恰當(dāng)?shù)臅r(shí)間再取出來調(diào)用
·功能有點(diǎn)類似于函數(shù)和方法
1.定義簡(jiǎn)單的block變量
類似于函數(shù)和方法的定義:參數(shù)思喊、返回值
(1)無參數(shù)無返回值
void (^Block名稱)()=^{......};
如:void (^logStar)()=^{NSLog(@"****"););
(2)有參數(shù)無返回值
void (^Block名稱)(參數(shù)類型1言沐,參數(shù)類型2...)=^(參數(shù)類型1 參數(shù)1邦投,參數(shù)類型2 參數(shù)2...){...};
如:void (^logStar2)(int)=^(int numberOfLine){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?for(int i=0;i<numberOfLine;i++)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NSLog(@"***");}//打印numberOfLine行***
(3)有參數(shù)也有返回值
返回值數(shù)據(jù)類型 (^Block名稱)(參數(shù)類型1伤锚,參數(shù)類型2...)=^(參數(shù)類型1 參數(shù)1,參數(shù)類型2 參數(shù)2...){....return 返回值}志衣;
如:int (^minusBlock)(int,int)=^(int x,int y){return x-y;};
2.block與typedef
typedef一般用法:typedef 數(shù)據(jù)類型 數(shù)據(jù)類型別名屯援;
在block中:typedef 返回值類型 (^block名稱)(參數(shù)1數(shù)據(jù)類型,參數(shù)2數(shù)據(jù)類型...);
如 typedef int (^MyBlock)(int,int);
//定義一個(gè)叫做MyBlock的數(shù)據(jù)類型念脯,它存儲(chǔ)的代碼必須返回int狞洋,必須接收兩個(gè)int類型的參數(shù)
//利用MyBlock類型可以定義block變量
用法如:MyBlock minusBlock=^(int x,int y){ return x-y;};
注意:
(1)調(diào)用block之前一定要做判斷才嚴(yán)謹(jǐn)
如:void goToWork(void(^work)())={if(work!=nil) work();}
調(diào)用goToWork()時(shí)不會(huì)報(bào)錯(cuò),因?yàn)橐呀?jīng)做了work是否為空的判斷和二,若沒有if(work!=nil)的判斷徘铝,直接調(diào)用goToWork()時(shí)由于傳的參數(shù)為空,程序會(huì)報(bào)錯(cuò)!
(2)默認(rèn)情況下惕它,block能調(diào)用但不能修改外面的局部變量
但在局部變量前加上修飾__block怕午,則能在block中修改變量值