block是ios4.0+和Mac osX 10.6以後引進的對C語言的拓展,用來實現匿名函數的特性。所謂匿名函數,也稱閉包函數,即允許創建一個臨時的沒有指定名稱的函數。最經常用作回調函數(callback)參數的值,當然也有其他用法。比如說作為一個變量值來使用,具體用法將在後面介紹。
-(void)blockTestOne { void(^blockOne)(void) = ^(void){ NSLog(@"this is blockOne"); }; blockOne(); }可以看到,上面的代碼,我們是在一個函數blockTestOne裡定義了一個無返回值,無參數的block,叫做blockOne,然後我們緊接著在後面調用了這個blockOne。因為我們的block沒有參數,所以在寫的時候還可以簡寫成:
-(void)blockTestOne { void(^blockOne)(void) = ^{ NSLog(@"this is blockOne"); }; blockOne(); }即省略了等號後面的參數列表。 控制台輸出結果:
-(void)blockTestTwo { void(^blockTwo)(int) = ^(int a){ NSLog(@"blockTwo == %d", a); }; blockTwo(20); }在這裡,我們定義了一個無返回值,參數類型為int型的block變量,名為blockTwo,然後我們調用了blockTwo,傳入參數20,控制台打印結果為:
- (void)blockTestThree { int (^blockThree)(int) = ^(int b){ NSLog(@"blockThree parameter == %d", b); return 10; }; NSLog(@"%d", blockThree(20));我們在這裡定義了一個返回值為int型,並且參數為int型的block變量,然後block實現裡面打印了他的參數,最後回返一個常量10;我們又在block打印了blockThree,並且給他傳了個參數20。控制台打印結果為:}
在這裡需要注意的是,因為我們定義的blockThree是有返回值的,所以當在他的實現中(即等號右邊大括號裡),如果沒有返回值return,編譯器會直接給我們報錯:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"" alt="\">
- (void)testBlock { void(^blockOne)(void) = ^{ NSLog(@"this is blockOne"); }; int c = 10; void(^blockTwo)(void) = ^(void){ NSLog(@"this is blockTwo %d ", c); }; void(^blockThree)(void) = [[blockTwo copy] autorelease]; NSLog(@"blockOne address == %@", blockOne); NSLog(@"blockTwo address == %@", blockTwo); NSLog(@"blockThree address == %@", blockThree); }在上面這段代碼中,我們分別定義了三個block變量,blockOne,blockTwo和blockThree,然後,我們分別打印了他們三個的地址,他們三個的區別是,blockOne實現的僅僅是打印一句話,沒有使用任何外部變量(block定義以外的變量),而blockTwo實現的是打印了一句話,並寫使用了一個外部變量c,而blockThree實現的是將blockTwo拷貝一分即copy一下,然後控制台打印的結果如下: