zoukankan      html  css  js  c++  java
  • Objective-C:Block

      Block是OC中一种与其它语言的语法区别较大的一种用法,需要注意:

    • Block也叫代码段,它封装了一段代码,可以在任何时候执行;
    • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值;
    • 它和传统的函数指针很类似,但也有区别:block是inline(内联函数)的,并且默认情况下它对局部变量时只读的;
    • Apple建议尽量多使用block;
    • 在多线程、异步任务、集合遍历、集合排序、动画转场中用的较多。

      Block有两种使用方法:

      1.直接定义一个block

        // 定义了一个block,这个block返回值是int类型,接收两个int类型的参数
        int (^Sum) (int, int) = ^(int a, int b) {
            return a + b;
        };
        //调用block
        int a = Sum(10 ,11);
        
        NSLog(@"%i", a);

      2.先用typedef定义block类型,再用该block类型定义具体的block

    typedef int (^Oper) (int, int);
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
        //声明了一个block变量,做加法功能
        Oper add = ^(int a, int b) {
            return a + b;
        };
        NSLog(@"%i",  add(10, 10));
        
        //声明了一个block变量,做减法功能
        Oper sub = ^(int a, int b) {
            return a - b;
        }
        NSLog(@"%i",  sub(10, 10));
        
        }
        return 0;
    }

      这样使用更具灵活性,可以定义一类操作类型,再利用这种操作类型定义具体的操作,比如我还可以继续定义乘法和除法的block。

      Block可以访问局部变量,但是不能改变它,如果需要修改,需用__block作特殊声明:

        // __block有2个下划线
        __block int c = 15;
        // 声明了一个block变量
        Oper add = ^(int a, int b) {
            // 如果外部的变量用了__block关键字,就可以在block内部修改这个变量
            c = 19;//如果不加__block声明,这句会报错,只能打印c的值
            // block可以访问外面定义的变量
            NSLog(@"c is %i", c);
            return a + b;
        };
  • 相关阅读:
    Pyinstaller(python打包为exe文件)
    matplotlib 填充颜色
    Visual Studio 2015 Enterprise
    latex中pdflatex与xelatex的区别
    latex插图续
    dva+umi+antd项目从搭建到使用(没有剖验证,不知道在说i什么)
    umi+dva+antd新建项目(亲测可用)
    HTTP缓存机制
    企业网站常见需求整理
    立足于运维与监控的前端框架 NoahV
  • 原文地址:https://www.cnblogs.com/yif1991/p/5066080.html
Copyright © 2011-2022 走看看