OC中block知识点使用方法

作者: woooooo | 来源:发表于2016-09-15 12:41 被阅读122次

    block

    作用

    • block用来保存一段代码
    • block标志 ^
    • 跟函数很像
      • 1.可以保存代码
      • 2.有返回值
      • 3.有形参
      • 4.调用方式一样
    • 无返回值无参数
        //定义block变量
        void (^myblock)() = ^ {
          //没有形参可以省略后面的()
            NSLog(@"----");
        };
        
         //利用block调用block内部的代码
        myblock();
    
    • 有返回值有参数
        int (^sumblock)(int, int) = ^(int a, int b) {
            return a + b;
        };
        
        int c = sumblock(10,11);
        
        NSLog(@"%d",c);
        
    

    block的重定义

    • 我们先看一段关于typedef重定义函数指针的
    定义一个两数之和的函数
    int sum(int a, int b) {
        return a + b;
    }
    
    定义两个函数指针指向sum
        int (*p1)(int, int) = sum;
        int (*p2)(int, int) = sum;
        
    因为代码过多重复我们可以typedef重定义一个函数指针类型
    
    typedef int (*SumP)(int, int);   
    //ps:重定义函数指针 (*SumP)中SumP就是类型名
    
    以后我们就可以这样定义两个函数指针
    
        SumP p3 = sum;
        
        SumP P4 = sum;
    
    

    block访问外面的变量

    block内部可以访问外部变量

        int a = 5;
        
        void (^blockA)() = ^() {
            
            NSLog(@"%d",a);
        };
        
        blockA();
    

    打印结果为

    2016-09-15 14:01:18.552 block[590:22729] 5
    
    

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

    • 如下这样写会报错
        
        int a = 5;
        
        void (^blockA)() = ^() {
            
            a = 3;
        };
        
    
    • 给局部变量加上__block关键字,这个局部变量就可以block内部修改(如下这样不会报错)
        
        __block int a = 5;
        //变量前加上__block修饰符
        void (^blockA)() = ^() {
            
            a = 3;
        };
        
        blockA();
    

    typedef重定义block类型

    • typedef重定义block类型和函数指针很像
     typede int (^MyBlock)(int, int); MyBlock 是类型名
     
     MyBlock sumBlock;
     //定义一个MyBlock类型的变量
     sumBlock = ^(int a, int b) {
            return a + b;
        };
    //给block变量赋值保存的代码
    
    
    我们定义一个减法类型的
        MyBlock minusBlock = ^(int a, int b) {
            return a - b;
        };
        
        int minus = minusBlock(25,12);
        
        NSLog(@"%d",minus);
     
     //使用MyBlock类型连续定义变量 
       MyBlock a, b; 
    
    

    总结

    1>.如何定义block变量

    int (^sumBlock)(int, int);
     void (^myBloc)();
    

    2> 如何利用block封装代码

    ^(int a, int b) {
     return a - b;
     }
     
     ^() {
     NSLog(@"--------");
     }
     
     ^ {
      NSLog(@"--------");
     //参数为空时()可以省略
     }
    

    3> block访问外部变量

    • block内部可以访问外部变量
    • 默认情况下block内部不能修改外面的局部变量
    • 给局部变量加上__block关键字,这个局部变量就可以block内部修改 原因--(将OC代码反编译C++可以看到)block与外部变量默认是值传递,当加上__block修饰之后就会修改成地址传递,这样就可以修改外部变量了

    4>利用typeddef定义block类型

    
    
    typedef int (^MyBlock)(int, int);
    
    
    
    
    MyBlock block; //定义一个MyBlock 类型的变量
     
     MyBlock block1, block2; //连续定义两个MyBlock 类型的变量
     
     
     block1 = ^(int a, int b) {
     
     return a - b;
     };
     
     MyBlock block3 = ^(int a, int b) {
     return a + b;
     };
    

    相关文章

      网友评论

        本文标题:OC中block知识点使用方法

        本文链接:https://www.haomeiwen.com/subject/zkjbettx.html