随笔 - 262  文章 - 0  评论 - 5  阅读 - 20万

【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用法。



posted on   wp7ers  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示