【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用法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)