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)); <h2>}</h2>我们在这里定义了一个返回值为int型,并且参数为int型的block变量,然后block实现里面打印了他的参数,最后回返一个常量10;我们又在block打印了blockThree,并且给他传了个参数20。控制台打印结果为:
在这里需要注意的是,因为我们定义的blockThree是有返回值的,所以当在他的实现中(即等号右边大括号里),如果没有返回值return,编译器会直接给我们报错:
- (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一下,然后控制台打印的结果如下:
原文地址:http://blog.csdn.net/u013950854/article/details/38026849