1. block概念
block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性。所谓匿名函数,也称闭包函数。即同意创建一个暂时的没有指定名称的函数。
最经经常使用作回调函数(callback)參数的值,当然也有其它使用方法。
比方说作为一个变量值来使用,详细使用方法将在后面介绍。
2. block定义:
详细定义例如以下图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk1MDg1NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
1⃣️ 我们先来定义一个简单的。无返回值,无參数的block:
-(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();
}
即省略了等号后面的參数列表。
2⃣️接下来,我们定义一个有參数,无返回值的block:
-(void)blockTestTwo
{
void(^blockTwo)(int) = ^(int a){
NSLog(@"blockTwo == %d", a);
};
blockTwo(20);
}
在这里,我们定义了一个无返回值。參数类型为int型的block变量,名为blockTwo。然后我们调用了blockTwo,传入參数20,控制台打印结果为:
3⃣️然后,我们再来定义一个有返回值,而且有參数的block:
- (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。编译器会直接给我们报错:
3. block的存储域。
看过我之前博客文章《block传值以及利用block封装一个网络请求类》点击打开链接的朋友一定好奇,为什么利用block定义的属性,要用copy特性?如图:
- (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一下,然后控制台打印的结果例如以下:
。还有__block的使用,记得关注哦。今天实在太晚了。
。
。