標籤:
在現階IOBlock 是iOS在4.0之後新增的程式文法,嚴格來說block的概念並不算是基礎程式設計的範圍,對初學者來說也不是很容易瞭解,但是在iOS SDK 4.0之後,block幾乎出現在所有新版的API之中,換句話說,如果不瞭解block這個概念就無法使用SDK 4.0版本以後的新功能,所以我們必須要熟練掌握block的使用
1、正則開始我們先認識一下如何來定義一個簡單的block
//1 無參數無傳回值 void (^ MyBlock1)(void); //2 有參數無傳回值 void (^ MyBlock2)(int a,int b); //3 有參數有傳回值 int (^ MyBlock3)(int a,int b);
2、針對block的聲明,我們如何真正意義上的實現他呢?下面我們探討一下如何?一個有功能的block,我們拿第一個為例子
void (^ MyBlock1)(void)=^(void){ NSLog(@"這是我的第一個block"); };
這樣我們就成功的實現了一個bock,上面是針對了沒有傳回值的block,針對有傳回值的如何?呢,同樣的類似於函數,你只要在最後返回即可了,比如我們用第三個距離,返回兩個數之間的和
int (^ MyBlock3)(int a,int b)=^(int a,int b ){ return a+b; };
3、上面我們完成了block得定義和實現,下面我們會考慮如何使用他了吧,其實使用bock是非常簡單的,我們只需要按照使用函數那樣使用就可以了,如下所示
// 調用block1(無傳回值無參數) MyBlock1(); // 調用block3(有傳回值有參數) int value= MyBlock3(10,20);
4、block作為參數,在開發app的時候你會發現很多情況下都是block作為參數,這也是block的廣泛應用之一,下面我們看看如何讓block在作為參數,現在我們定義Dog對象,DOG對象裡面有屬性和行為,如下
同時定義一個主人類,主人擁有狗,主人可以對狗發布指令,狗根據不同的指令來執行不同的操作,這裡我們採取塊的形式,將指令通過塊傳遞資訊,此時我們就需要用到塊作為參數:
實現部分如下
在main函數中,我們按照如下方式引用即可
Host * host=[[Host alloc] init]; Dog * dog=[[Dog alloc] init]; dog.name=@"dahuang"; host.dog=dog; //0 將指令封裝到block中然後傳遞資訊 void (^ myDog)(Dog *dog)= ^(Dog *dog) { [dog run]; [dog canBark]; [dog speakName]; }; //1 告訴狗要做的事情 [host askDog:myDog]; //2 讓狗去做 [host toDo];
5、__block 關鍵字,block可以作為參數進行傳遞,因此block的執行時機可能不是很確定,所以當我們需要在block裡面,將執行的結果賦值給外面的變數的時候需要注意一點,如果想把block的結果賦值給局部變數,則會報錯,原因是當你執行block的時候你的局部變數可能已經銷毀了,所有block的不能直接給局部變數賦值,當然如果是全域變數是可以的。Block還引入了另一種關鍵字,將局部變數的生命週期變為和全域變數一樣即可,這樣我們就能給局部變數賦值了,如下所示:
__block int sum=0; void (^ myBlock) (int,int)=^(int a ,int b){ sum=a+b; };
傑瑞教育
出處:http://www.cnblogs.com/jerehedu/
著作權聲明:本文著作權歸煙台傑瑞教育科技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
技術諮詢:
IOS程式文法之block的使用掌握