OC学习笔记之Block基础知识


● Block封装了⼀一段代码,可以在任何时候执⾏

● Block可以作为函数参数或者函数的返回值,⽽其本⾝又可以带输⼊参数或返回值。

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



#import


int main(int argc,const char * argv[])

{


    @autoreleasepool {

        

        //不带参数无返回值的块

       void (^printfstr)(void)= ^(void)

        {

           NSLog(@"**********");

        };

        printfstr();

        

        //带参数有返回值的块

       double (^hypot)(double,double) = ^(double num1,double num2)

        {

           return sqrt(num1*num1 + num2*num2);

        };

    

       NSLog(@"%lf",hypot(3,4));

        

        //带参数无返回值的块变量

        

        //先只定义块变量

       void (^print)(NSString *);

        //将块赋给指定的块变量

        print= ^(NSString * info)

        {

           NSLog(@"%@",info);

        };

       //调用块

        print(@"我是一个块变量");

        

       

    

        //块可以访问局部变量的值,但是不能够修改,否则会程序崩溃

       int a = 20;

       void (^ printMy)(void)=  ^(void)

        {

            //尝试修改a的值,程序会报错;

            //a=30;  variable is not assignable;

           NSLog(@"%i",a);

        };

        printMy();

        a=100;

        printMy();//调用结果是20不是100

        //【注】因为当程序使用块去访问局部变量时,系统在定义块时就会把局部变量的值保存在块中,而不是等到执行是时才去访问,获取局部变量的值。赋值语句位于块定义之后,故不会影响块的值。

        

        

       __block int b=1;

        //__block修饰局部变量,块只会在执行的时候获取局部变量的值,并能够改变局部变量的值

       void (^printb)(void) = ^(void)

        {

           NSLog(@"%i",b); // 1

            b =5;//修改局部变量的值也是允许的

           NSLog(@"%i",b); // 5

        };

        printb();

        b=20;

        printb();// 20   // 5

       NSLog(@"%i",b); // 5

        

        


        //使用typdef定义 block;可以快速定义多个块(只要返回值,形参类型相同)

       typedef int (^myblock) (int ,int );

       myblock b1,b2;

        b1 = ^(int c,int d)

        {

           return c-d;

        };

        b2 = ^(int a1,int a2)

        {

           return a1*a2;

        };

       NSLog(@"%i",b1(5,2));

       NSLog(@"%i",b2(5,2));

        

    

        

    }

   return 0;

}

OC学习笔记之Block基础知识_第1张图片


你可能感兴趣的:(OC,objective-c)