OC学习-block处理

来源:互联网 发布:矩阵qr分解 编辑:程序博客网 时间:2024/05/16 17:02

在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, [namesubstringToIndex: 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 = [selfobjcMethod:^int(int name) {

        

        return (name+5);

    }];

    

    NSLog(@"%d",number);



现在我所需要用到的就是上面三种情况,所以暂时研究了这几个,在研究的过程中我发现,只有代码块作为参数的时候,才能在代码块中使用self来使用类成员变量,而其他的几种情况都不能使用类成员变量,同时若需要使用外部变量,也必须是将代码块写在函数体中,然后使用关键字__block声明变量才行,否则会报错;


学会使用这个的时候,发现在某些逻辑上用起来还是挺方便的,以前害怕这些逻辑,现在学习了倒是挺喜欢的,哈哈!



0 0