ios代码块学习总结之一

        在oc中,代码是比较常用的。它极大的方便了我们的编程。下面对代码块做一下总结。供个人学习交流之用。

        代码块对象(简称代码块)是对C语言中函数的扩展。除了函数中的代码,代码块还包含变量绑定。代码块有时也被称为闭包(closure)。

        代码块的声明和定义:

        <returntype> (^blockname)(list of arguments) =^(arguments){body;};

        下面,以具体例子来说明代码的使用

        1.使用代码块

    int value =3;

    int (^multiplyBlock)(int number) =^(int number){

        return (value * number);

    };

    int result = multiplyBlock(10);

    NSLog(@"Result:%d",result);

        这里需要注意下代码块里面访问了value,说明代码块可以访问与它同时创建的有效变量。这个特性很特别,也很重要,希望大家一定要留意。

        2.直接使用代码块

        使用代码块时通常不需要创建一个代码块变量,而是在代码中内联代码块的内容,通常,你会需要一个将代码块作为参数的方法或者函数 

-(void)directblock:(void(^)(int a,int b))block{

    block(10,20);

}

[self directblock:^(int a,int b){

        NSLog(@"a:%d,b:%d",a,b);

    }];

        可以看到directblock函数使用了一个block类型的参数: void(^)(int a,int b),可以看到

  把其写法也很好记,把block类型的声明去掉名字可以了,是不是很简单。

        3.使用typedef关键字

           使用typedef的好处我就不说了,直接上代码吧

typedef int (^AddtionBlock)(int a,int b);

    AddtionBlock addtionBlock = ^(int a,int b){

        return a+b;

    };

    NSLog(@"%d,%d",addtionBlock(4,5),addtionBlock(10,3));

看起来也很简单,直接在block声明的前面加上一个typedef就好了,然后就可以使用定义好的名字来定义block变量啦。

        4.代码块和变量

          代码块被声明后会捕捉创建点时的状态,代码块可以访问函数用到标准类型的变量

        (1)本地变量

                

    typedef double (^MKSampleMultiplyBlockRef)(void);

    double a =10,b=20;

    MKSampleMultiplyBlockRef multiply =^(void){return a*b;};

    NSLog(@"%f",multiply());

    a=20;

    b=50;

    NSLog(@"%f",multiply());

           你认为第二个NSLog会输出什么呢?1000?答案是否定的,因为变量是本地的,代码块会在定义时复制并保存它们的状态。

        (2)全局变量

                

    typedef double (^MKSampleMultiplyBlockRef)(void);

    static double a =10,b=20;

    MKSampleMultiplyBlockRef multiply =^(void){return a*b;};

    NSLog(@"%f",multiply());

    a=20;

    b=50;

    NSLog(@"%f",multiply());

        如果是全局变量的化,第二个NSLog就会输出1000了

        (3)_block变量

                本地变量会被代码块作为常量获取到。如果你想要修改他的值,必须将它们声明为可以修改的。

            

typedef void (^MKSampleMultiplyBlockRef)(double a,double b);

//    double c=3;

//    MKSampleMultiplyBlockRef mutiply=^(double a,double b){c=a*b;};

    __block double c=3;

    MKSampleMultiplyBlockRef mutiply=^(double a,double b){

        c=a*b;};

    mutiply(2,5);

    NSLog(@"%f",c);

    好了,以上就是代码使用的一些基础知识。另外还有关于代码块,还有一个块比较重要就是oc变量的内存管理问题。留在下一篇里讲吧。

    注:本文只是作为个人复习和总结只用,里面内容大量参考了 《Objective-C 基础教程 》第2版 人民邮电出版社 周庆成 译



猜你喜欢

转载自blog.csdn.net/u012398902/article/details/80034844