美文网首页将来跳槽用
OC基础学习12:代码块(Block)

OC基础学习12:代码块(Block)

作者: Andy_Ron | 来源:发表于2017-09-12 21:19 被阅读67次

代码块(Block)/闭包(closure) 是对C语言中函数的扩展。
代码块两种类的绑定:
自动绑定(automatic binding) 栈内存
托管绑定(managed binding) 堆内存

  • 代码块和函数指针
    函数指针的声明:
    void (*my_func)(void);
    *变成^(幂符号)变成代码块定义:
    void (^my_block)(void);

    代码块展示:

          int (^square_block)(int number) = ^(int number) {return (number * number);};
          int result = square_block(5);
          printf("Result = %d\n", result);
    

    等号前面是代码块的定义,而等号后面是实现内容。一般形式:

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

    没有参数时可以简写:

          void (^theBlock)(void) = ^{ printf("Hello Blocks!\n"); };
    
  • 使用代码块
    代码块可以访问与它相同的(本地)有效范围内声明的变量。

          int value = 6;
          int (^multiply_block)(int number) = ^(int number) { return (value * number);};
          value = 8;
          int result2 = multiply_block(7);
          printf("Result2 = %d\n", result2);  // 是6*7,不是8*7
    
  • 直接使用代码块

        NSArray *array = [NSArray arrayWithObjects:@"Amir", @"Mishal", @"Irrum", @"Adam", nil];
        NSLog(@"Unsorted Array %@", array);
        NSArray *sorteArray = [array sortedArrayUsingComparator:^(NSString *objet1, NSString *object2) {
            return [objet1 compare:object2];
        }];
        NSLog(@"Sorted Array %@", sorteArray);
  • 使用typedef关键字
        typedef double (^MKSampleMultiply2BlockRef)(double c, double d);
        MKSampleMultiply2BlockRef multiply2 = ^(double c, double d) { return c * d; };
        printf("%f, %f", multiply2(4, 5), multiply2(5,3));
        typedef void (^MKSampleVoidBlockRef)(void);
        typedef void (^MKSampleStringBlockRef)(NSString *);
  • 代码块和变量
    代码块被声明后会捕捉创建点时的状态。
    代码块可以访问函数用到的标准类的变量:

    • 全局变量,包括封闭范围内声明的本地静态变量。
    • 全局函数
    • 封闭范围内的参数
    • 函数级别(即与代码块声明时相同的级别)的_block变量。
    • 封闭范围内的非静态变量会被获取为常量。
    • Objective-C的实例变量
    • 代码块内部的本地变量
  • 本地变量

          typedef double (^MKSampleMultiplyBlockRef)(void);
          
          double a = 10, b = 20;
          MKSampleMultiplyBlockRef multiply = ^(void){ return a * b; };
          NSLog(@"%f", multiply());  // 200.0
          a = 20;
          b = 50;
          NSLog(@"%f", multiply());  // 200.0
    
  • 全局变量

          typedef double (^MKSampleMultiplyBlockRef)(void);
    
          static double a = 10, b = 20;
          MKSampleMultiplyBlockRef multiply = ^(void){ return a * b; };
          NSLog(@"%f", multiply());    // 200.0
          a = 20; b = 50;
          NSLog(@"%f", multiply());    // 1000.0
    
  • 参数变量
    代码块中的参数变量与函数中的参数变量具有同样的作用。

          typedef double (^MKSampleMultiply2BlockRef)(double c, double d);
          MKSampleMultiply2BlockRef multiply2 = ^(double c, double d) { return c * d; };
          printf("%f, %f", multiply2(4, 5), multiply2(5,3));
    
  • __block变量
    本地变量会被代码块作为常量获取到。在代码块中修改会报错。

          double c = 3;
          MKSampleMultiplyBlockRef multiply = ^(void) { c = 5; return c; };
          //报错: Variable is not assignable (missing __block type specifier)
    

    将本地变量标记为__block,就可以修改了

          __block double c = 3;
          MKSampleMultiplyBlockRef multiply = ^(void) { c = 5; return c; };
    
  • 代码块内部的本地变量

关于Block详细可查看Apple 的官方文档 Blocks Programming Topics

相关文章

  • OC基础学习12:代码块(Block)

    代码块(Block)/闭包(closure) 是对C语言中函数的扩展。代码块两种类的绑定:自动绑定(automat...

  • swift语法--12-1闭包基本概念

    swift语法--12-1闭包基本概念 block和闭包区别 OC:block类似于匿名函数, 用于封装代码块, ...

  • iOS_Block

    block的本质其实就是OC对象, Block是oc的一段代码块,在需要的时候调用。 Block变量的声明格式为:...

  • 总纲

    一句代码创建常用UI控件类与对象OC中面向对象的编程思想OC基础语法复习OC中的协议OC中的block学习导航栏按...

  • iOS探究Block的实现过程

    对于学习过Objective-C的人来说,一定知道OC中神奇的代码块block,下面我们就来讲一讲block。 B...

  • block小结

    block(代码块)实际上就是oc语言对于闭包的实现。 在oc中,主要有三种类型的block: 1._NSConc...

  • block(一)了解block

    block就是代码块组成的匿名函数,block是oc对于闭包的实现 1.可以嵌套定义,定义block方法和定义函数...

  • Swift 3.0之闭包(Closures)入门和OC bloc

    闭包是自包含的函数代码块,可以在代码中被传递和使用.(参考OC中的Block) 一. 定义闭包或者block 1....

  • block相关 问答

    1. block的本质和原理 block的本质实际上是OC对象,内部也存在着isa指针; block 可作为代码块...

  • iOS-Block的详解

    学习Block的感悟 一. iOS代码块Block 1.1 概述 代码块Block是苹果在iOS4开始引入的对C语...

网友评论

    本文标题:OC基础学习12:代码块(Block)

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