Objective-C的Block

來源:互聯網
上載者:User

標籤:

  Objective-C的Block 標籤: iOSobjective-cOS XBlock2016-04-13 14:05 226人閱讀 評論(0) 收藏 舉報 分類: 小白iOS筆記(3) 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

 

目錄(?)[+]

 聲明:

1、如果文章內容涉及到其他已經發表了,但文章中又未提及轉載事項,請及時與本人聯絡。

2、本文為個人理解,如果部分知識點與真實情況有出入,請忽略本文。

3、如本文解釋有任何問題導致您的損失,概不負責。

4、本文是寫給小白的,大神可以忽略,或者提點意見,但是……不要(或者輕點)噴。

本文:1 瞭解Block1.1 概念

(1)帶有局部變數的匿名函數(代碼塊)。

(2)使用Blocks可以不聲明C++和Objective-C類,也沒有使用靜態變數、靜態全域變數或全域變數時的問題,僅用編寫C語言函數的原始碼量即可使用帶有局域變數的匿名函數。

1.2 文法

(1)^【傳回值類型】【(參數列表)】運算式

*其中“【】”內的內容為可省略內容。

(2)其中,傳回值類型、參數列表都可以省略。即使有傳回值,也可省略傳回值類型,編譯器會自動識別傳回值類型(NSObject或者void)。

例如:

 

[objc] view plain copy 
  1. ^void (id testObj) {  
  2.        testObj= [[NSString alloc] initWithString:@"This is a iOS Block test!"];  
  3.        NSLog(@”%@”,testObj);  
  4. }  
(3)建立Block,其實是系統自動建立了一個函數,而Block的賦值其實就是將該函數的指標進行儲存、傳遞,類似函數指標賦值(Block賦值,下文會講到)。

 

2 Block的用法2.1 Block類型變數

在Block文法下,可將Block代碼塊賦值給Block類型的變數。即整個Block代碼塊可以作為“值”賦值,賦值對象為聲明為Block類型的變數。

2.1.1 以Block的傳回值作為賦值對象

這種類型再熟悉不過,與普通的函數類似,將函數中return的值作為賦值對象。

例如:

[objc] view plain copy 
  1. int testInt = ^int {  
  2.        return7;  
  3. };  

 

2.1.2 以Block作為賦值對象

(1)在Block文法下,可將Block代碼塊賦值給已聲明為Block類型的變數。

例如:

[objc] view plain copy 
  1. //聲明Block類型變數  
  2. int (^testBlk)(int);  
  3. //聲明Block類型變數,文法為“傳回值類型 (^Block代碼塊名稱)【(參數類型列表)】”  
  4. //將Block代碼塊賦值給Block類型變數  
  5. testBlk = ^(int count){  
  6.        returncount + 1;  
  7. };  

 

(2)在Block文法下,可將Block代碼塊作為函數的傳遞參數。

例如:

[objc] view plain copy 
  1. void testFunction(Bool testBool, int (^testBlk)(int)){  
  2.        if(testBool) {  
  3.               testBlk;  
  4.     }  
  5. }  

 

(3)在Block文法下,可將Block代碼塊作為函數的傳回值。

例如:

[objc] view plain copy 
  1. int (^testBlk)(int) testFunction(){  
  2.        return^(int count) { return count + 1;};  
  3. }  

 

(4)用typedef聲明Block類型,利於代碼可讀性。

例如:

[objc] view plain copy 
  1. //聲明Block類型,作為Block的參數類型  
  2. typedef int (^testBlockType)(int);  
  3. int testInt = 0;  
  4. //作為傳遞參數時  
  5. void testFunction(testBlockType testBlk){  
  6.        testBlk= ^(int count) { return count + 1;};  
  7.        testInt= testBlk(10);  
  8. }  
  9. //作為傳回值時  
  10. testBlockType testFunction(){  
  11.        return(^(int count) { return count + testInt;});  
  12. }  

 

2.2 在Block中,截獲自動變數

在Block的代碼塊中,截獲代碼塊之外的變數,其變數值、使用方式須遵守Block文法的規則。

2.2.1截獲自動變數

(1)Block中,Block代碼塊截獲的自動變數值,是儲存在該自動變數的瞬間值。

例如:

[objc] view plain copy 
  1. int testInt = 0;  
  2. void (^blk)() = ^{printf(“value = %d”,testInt)};  
  3. blk();  
  4. //此處列印結果為:value = 0  
  5. testInt = 1;  
  6. blk();  
  7. //此處列印結果為:value = 0  

 

(2)Block中,截獲自動變數後,不能改寫該變數的值。

例如:

[objc] view plain copy 
  1. int testInt = 0;  
  2. void (^blk)() = ^{ testInt = 1;};  
  3. blk();  
  4. //此處報錯。在Block代碼塊中,無法改寫非該Block內部自動變數的值。  

 

2.2.2 __block說明符

如果需要在Block代碼塊中改寫該Block之外的自動變數的值,需要在該自動變數上附加__block說明符。

例如:

[objc] view plain copy 
  1. __block int testInt = 0;  
  2. void (^blk)() = ^{ testInt = 1;};  
  3. blk();  

 

 

參考:

 

《Objective-C進階編程iOS與OS X多線程和記憶體管理》【日】KazukiSakamoto  Tomohiko Furumoto 著  黎華 譯

Objective-C的Block

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.