iOS中Block介紹(一)基礎,iosblock介紹基礎

來源:互聯網
上載者:User

iOS中Block介紹(一)基礎,iosblock介紹基礎
一、概述

Block是C層級的文法和運行時特性。Block比較類似C函數,但是Block比之C函數,其靈活性體現在棧記憶體、堆記憶體的引用,我們甚至可以將一個Block作為參數傳給其他的函數或者Block。

二、熱身

先看一個比較簡單的Block例子:

  1. int multiplier = 7; 
  2. int (^myBlock)(int) = ^(int num) { 
  3.     return num * multiplier; 
  4. }; 

在這個例子中,myBlock是一個Block變數,它接受一個int類型的參數,返回一個int類型的值。是不是很像C函數?

來,讓我們typedef一下

  1. typedef void (^BoolBlock)(BOOL);//一個只接受一個BOOL參數,沒有傳回值的block 
  2. typedef int (^IntBlock)(void);//一個沒有參數,返回int的block 
  3. typedef BoolBlock (^HugeBlock)(IntBlock);//看看,這個HugeBlock的參數和傳回值都是block 

三、更詳細的例子

注意:上面的typedef都還有效~

主動調用一下:

  1. - (void)someMethod 
  2.     BoolBlock ablock = ^(BOOL bValue) { 
  3.         NSLog(@"Bool block!"); 
  4.     }; 
  5.     ablock(); 

作為參數返回:

  1. typedef void (^BoolBlock)(BOOL); 
  2. - (BoolBlock)foo() 
  3.     BoolBlock ablock = ^(BOOL bValue) { 
  4.         NSLog(@"Bool block!"); 
  5.     }; 
  6.     return [[ablock copy] autorelease];//一定要copy,將其複製到堆上,更詳細的原理,將在後續章節講解 

類的一個成員:

  1. @interface OBJ1 : NSObject 
  2. @property (nonatomic, copy)BoolBlock block;//理由同上啊,同學們 
  3. @end 
  4.  
  5. OBJ1 *obj1 = ... 
  6. obj1.block = ^(BOOL bValue) { 
  7.         NSLog(@"Bool block!"); 
  8.     }; 

其他函數的參數:

  1. - (void)foo(BoolBlock block) 
  2.     if (block) { 
  3.         block(); 
  4.     } 

甚至其他block的參數:

  1. BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}}; 
  2. HugeBlock hBlock = ^(BoolBlock bB) {bB();}; 
  3.  
  4. hBolck(bBlock); 

啊,全域變數!:

  1. static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;}; 
  2. int main() 
  3.     printf("%d\n", maxIntBlock(2,10));   
  4.     return 0; 

好了,你知道block大概能怎麼用了。

四,特殊的標記,__block

如果要在block內修改block外聲明的棧變數,那麼一定要對該變數加__block標記:

  1. int main() 
  2.     __block int i = 1024; 
  3.     BoolBlock bBlock = ^(BOOL bV) { 
  4.         if (bV) { 
  5.             i++;//如果沒有__block標記,是無法通過編譯的。 
  6.         } 
  7.     }; 
每天都有不一樣的太陽

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.