在C++中存在回调函数,那么在OC中也应该有回调函数,而最初了解的是协议,其中的协议和回调很相似,但是又有差别,协议必须继承协议才能使用协议,同时也必须签订协议方有效;
而在使用OC过程中发现很多API函数中涉及到一个block的东东,和C++中的回调函数是一样的处理方式,故猜测应该就是所谓的回调函数吧,但是网上查找相关资料发现大家都叫它代码块,也许是因为这其中的代码可以到处存放吧;
网上查找资料学习了下,自己总结下,主要用途有下面几种:
1、函数中加入代码块,同时使用外部变量:
__block int local = 500;
void(^block)(void) = ^(void)
{
local++;
NSLog(@"local:%d", local);
};
block();
NSLog(@"local:%d", local);
2、函数外代码块,在函数内部使用:(另外也是C++中所说的递归)
static void (^const countBlock)(int , NSString*) = ^(int index, NSString* name){
if(index > 0)
{
NSLog(@"%d = %@",index, [name substringToIndex: index]);
countBlock(index - 1,name);
}
};
countBlock(4,@"ceshi");
3、函数参数中加入代码块:
使用过OC的人都看到过这个api函数:
[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#> completion:<#^(BOOL finished)completion#>];
这其中就是使用代码块作为参数进行处理的,不过我有点没弄明白就是为什么它只对固定的几种形式处理有效,而在里面做某些事情的时候它无效;
声明函数:
- (int) objcMethod:( int (^) (int) ) square
{
NSLog(@"kkkkk");
return square(4);
}
在另外一个函数中调用:
int number = [self objcMethod:^int(int name) {
return (name+5);
}];
NSLog(@"%d",number);
现在我所需要用到的就是上面三种情况,所以暂时研究了这几个,在研究的过程中我发现,只有代码块作为参数的时候,才能在代码块中使用self来使用类成员变量,而其他的几种情况都不能使用类成员变量,同时若需要使用外部变量,也必须是将代码块写在函数体中,然后使用关键字__block声明变量才行,否则会报错;
学会使用这个的时候,发现在某些逻辑上用起来还是挺方便的,以前害怕这些逻辑,现在学习了倒是挺喜欢的,哈哈!