OC基础—block

------ android培训java培训、期待与您交流! ----------


OC基础—block

block:这是OC的一种数据类型(OC的基本数据类型有int char float double BOOL;还有其他的一些数据类型枚举,结构体,指针,id)

block的效率高,使用范围广:是用来保存代码的,类似于函数,但是比函数便捷。

函数:实在代码编译前,就要写好的,而且是不能改变的。

block不一样:

* Block封装了一段代码,可以在任何时候执行

* Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或者返回值

* 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

现在我们来看一下:Block可以在程序运行的时候定义一段代码

先看一个无返回值的Block:

int main ()
{
    // block用来保存一段代码
    // block的标志: ^
    /*
     block跟函数很像
     1. 可以保存代码
     2. 有返回值
     3. 有形参
     */
    // 定义block
    // 如果block没有形参^后的()可省略
    void(^myblock)() = ^{
        NSLog(@"_____________");
        NSLog(@"_____________");
    };
    
    // 调用block
    myblock();
    return 0;
}

定义一个block:

1. 返回值类型,无返回值就是void。

2. 返回值类型,之后就是一个(),括号里是block名称并且以^开头,^是block的标志。

3. block名称之后就是参数用括号括起来,没有参数就写一个()就行。

在来看一个有返回值有形参的Block

int main()
{
    // 带参数有返回值的block
    // 很像指向函数的指针
    /*
     int (*p)(int, int) = sum; // sum就是一个函数
     p(10, 11);
     */
    int(^sumblock)(int , int) = ^(int a, int b){
        return a + b;
    };
    
    int c = sumblock(10, 11);
    NSLog(@"%d", c);
    
    // 用来输出n条横线
    void(^lineBlock)(int i) = ^(int n)
    {
        for (int i = 0; i < n; i++) {
            NSLog(@"_________");
        }
    };
    lineBlock(5);
    return 0;
}

上面就可以看出,block很像指向函数的指针,只是标志不一样,真挚的标志是*,block的标志是^,但是block要比函数灵活,block可以在程序运行中进行定义。

!!!记住,定义玩block之后记得加上 ;

typedef定义block类型

    我们可以看出,定义一个block非常的麻烦都要写一大堆东西,我们可以用typedef定义block来简化过程。

    int(^sumblock)(int , int) = ^(int a, int b){
        return a + b;
    };


现在:我们用typedef

typedef int(^Myblock)(int, int);
// 调用的时候
Myblock sunblock = ^(int a, int b)
{ return a + b;};

block与外面变量的关系:

1. block内不是可以访问外面的变量

2. 默认情况下,block内部不能修改外面的局部变量

3. 给局部变量加上__block关键字,这个局部变量就可以在block内部修改

int main()
{
    int a = 10;
    __block int b = 20;
    void (^block)() = ^{
        b = 25;
    }
    block();
    return 0;
}

总结一下:

block要掌握的东西

1. 如何定义block

*int (^sumBlock)(int, int);

*void (^myBlock);

2. 如何利用block封装代码


^(int a, int b){

return a - b;

};


^(){

NSLog(@"______");

};

没有参数没有返回值可以写成这样

^{

NSLog(@"______");

};

3. block访问外面变量

* block内部可以访问外面的变量

* 默认情况下,block内部不能修改外面的局部变量

* 给局部变量加上__block关键字,这个局部变量就可以在block内部修改


4. 利用typedef定义block类型

typedef int (^MyBlock)(int, int);

以后就可以里利用MyBlock这种类型来定义block变量

如:

Myblock b1, b2;

b1 = ^(int a, int b)

{

return a + b;

};

b2 = ^(int a, int b)

{

return a - b;

};

或者:

MyBlock b3 = ^(int a, int b)

{

return a * b;

}


------ android培训java培训、期待与您交流! ----------


你可能感兴趣的:(OC基础)