zoukankan      html  css  js  c++  java
  • 【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用法。



  • 相关阅读:
    解决IntelliJ IDEA 创建Maven项目速度慢问题 DarchetypeCatalog
    加快项目创建 -DarchetypeCatalog=internal
    AKS (3) 在AKS中使用Azure File
    AKS (2) SSH登录到AKS Node
    Azure Virtual Network (18) 跨租户间的VNet Peering
    Azure ARM (23) 自定义Role
    Linux学习 (5) 安装Nginx
    Linux学习 (4) MySQL设置Master-Slave
    Linux学习 (3) 安装mysql
    Linux学习 (3) 配置LVM
  • 原文地址:https://www.cnblogs.com/mamamia/p/12201848.html
Copyright © 2011-2022 走看看