【iOS 入门】block (2)

oc block语法

    //定义block
    int(^block)(int a ,int b ) = ^(int a,int b){
        return a>b ? a : b ;
    };
    int d = block(3,4);

block的含意:匿名函数。对比java可以理解为内部类接口实现。

定义模型 :

  返回类型(^name)(参数,参数...) = ^(参数,参数...) { do something...};

类型不能省,(^)不能少。参可以没有但要写成(void).实现block时,返回类型不写,跟根据返回值确定。

参数及类型要写。参数必须括号括起。(int a ,,,,)

实例 : //有返回值 int 型

   //名字是:block 
   //参数两个,int a ,int b .必须括起来。C语言函数定义。 int(^block)(int a ,int b ) = ^(int a,int b){ return a>b ? a : b ; };

//返回类型不能加括号。
void(^block)(int a ,int b ) = ^(int a,int b){
        a>b ? a : b ;
    };

block 与变量的关系
  • block 与 局部变量的关系
    int temp = 100;
    void (^block1)(void) = ^(void) {
    NSLog(@"%d", temp++);
    NSLog(@"%d", temp + 1);
    }
    调用 block1();
    如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?
    __block int temp2 = 200; 用__block修饰一下变量, 便在block可以使用了
    __block int temp2 = 200;
    void (^block9) (void) = ^(void){
    temp2++; // 这样就可以修改了!
    };
    调用 block9();
    结果 201;
  • block与全局变量.
    在main函数外定义一个在main函数外定义一个temp3 = 300;
    void (^block11) (void) = ^(void){
    temp3++;
    NSLog(@"temp3 = %d", temp3 + 1);
    };
    调用 block11();
    结果 temp3 = 301;
    说明block中可以修改全局变量!

这个跟Java内部类十分的相似。内部类可以对局部变量操作需要声明成final .这里是__block.java 内部类对外部类有引用和copy。具体参考android Hnadler用法。



原文地址:https://www.cnblogs.com/mamamia/p/12201848.html