• IOS之Block讲解


      Block,称为代码块,它是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block。

      Block很像匿名方法,但实际上它是一种类型,它是用来封装保存代码的,只要用block封装的代码,可以在任何时候执行。Block效率很高,不仅可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

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

    一、Block定义

    返回值 (^ 块名)(参数1,参数2…);

    代码

        //无参无返回值的block
        void (^MyBlocks1)();
        
        //参数为整型的block
        void (^MyBlocks2)(int);
        
        //参数为NSString的block
        void (^MyBlocks3)(NSString *);
        
    //多个参数,有返回值的block
    BOOL (^MyBlocks4)(int, int);

    二、Block实现

    ^(参数1,参数2…){操作主体};

    代码

         MyBlocks1 = ^{
            NSLog(@" MyBlocks1");
        };
        
        MyBlocks2 = ^(int num){
            NSLog(@" MyBlocks2,参数为%i",num);
        };
        
        MyBlocks3 = ^(NSString *str){
            NSLog(@" MyBlocks3,参数为%@",str);
        };
        
        MyBlocks4 = ^(int num1, int num2){
            NSLog(@" MyBlocks4");
            if (num1>num2)
                return YES;
            else
    return NO;
     };

      三、声明的同时实现

    代码

    int (^myBlocks5)(int, int) = ^(int num1, int num2){
            return num1>num2?num1:num2;
    };

      四、代码块中的全局变量和局部变量

      在块中可以使用全局变量也可以使用局部变量,但是在块外面声明的实例变量默认情况下,在块中只能使用,但是不能修改。如果想修改,需要在变量前面添加__block

    代码

        int num1 = 10;
        __block int num2 = 10;
        void (^myBlocks6)() = ^(){
            NSLog(@"num1=%i, num2=%i",num1,num2);
            //num1 += 10; //错误!!!
            num2 += 10;
        };

      五、Block的调用

    块名(实参1,实参2…);

    代码

    int number = myBlocks5(10, 20);
    myBlocks6();

      六、Block作为参数

    代码

    //方法的声明
    + (void)dowmloadImg:(NSString *)url success:(void(^)(NSString *pic))success failure:(void(^)(NSString *error))failure;
    
    //方法的实现
    + (void)dowmloadImg:(NSString *)url success:(void (^)(NSString *pic))success failure:(void (^)(NSString *error))failure {
        BOOL flag = NO;
        if (flag) {
            success([NSString stringWithFormat:@"这是一张图片%@", url]);
        } else {
            failure(@"下载失败");
        }
    }
    
    //方法的调用
    [Test dowmloadImg:@"http://www.jerehedu.com/images/temp/logo.gif" success:^(NSString *pic) {
            NSLog(@"%@", pic);
        } failure:^(NSString *error) {
            NSLog(@"%@", error);
        }];
    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
     
  • 相关阅读:
    Notes for Advanced Linux Programming 2. Writing Good GNU/Linux Software
    GIT 子模块温习
    Memcached 源码分析——从 main 函数说起
    Zookeeper 初体验之——JAVA实例
    如何使用 indent 美化你的代码
    PGF/TIKZ 资源汇总
    Zookeeper 进阶之——Zookeeper编程示例(如何使用Zookeeper实现屏障Barriers和队列Queues)
    Zookeeper 进阶之——典型应用场景(二)
    如何将 Linux 内核实现的红黑树 rbtree 运用到你的 C 程序中?
    三行代码实现C语言单元测试框架
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4891029.html
Copyright © 2020-2023  润新知