block的声明创建以及使用
2016-04-20 13:52
483 查看
本人从事这么久,发现周边还是很多从事iOS的程序猿不怎么了解block 用法,即便他们其中还有几年的开发经验,但是一跟他们聊起block,他们眼睛睁得老大。另外,很多新手程序接触block时,可能也被它搞得一头雾水,所以我决定写下这篇,供大家参考, 有问题可以评论,大家一起进步。
苹果官方对block的介绍
我从官方那里拿个图来解释下block
这张图看到了block的基本结构,如果英语不懂,没事,但是我还是希望各位可以有道一下。
一、block的基本语法
a. 第一个int 代表aBblock的返回值类型
b. 第二个、第三个int 代表aBlock参数类型,也表明里面有2个int 类型的参数
c. (^aBlock)代表aBlock是变量名,而^则表示这个变量是block变量
d.同样,你也可以给参数起名字:
e.很多时候,我们需要将我们声明的block类型作为函数的参数,也有两种方式:
f.第二种方式是通过typedef定义一种新的类型,这也是大多数情况下采用的方式:
a.num1代表参数1,num2代表参数2;
b.因为声明中有表示aBlock的返回值类型为int,所以需要返回一个int类型的数
c.如果
上面还有简略写法(声明和创建一起来)
下面我将要说一个回调的简单demo(部分代码摘自网上)
详细回调介绍请查看我之前写的文章
在 demo之前说下
a. “主语”部分
“实现”部分
本页demo代码 下载
苹果官方对block的介绍
我从官方那里拿个图来解释下block
这张图看到了block的基本结构,如果英语不懂,没事,但是我还是希望各位可以有道一下。
一、block的基本语法
1.block的声明
int (^aBlock)(int, int);
a. 第一个int 代表aBblock的返回值类型
b. 第二个、第三个int 代表aBlock参数类型,也表明里面有2个int 类型的参数
c. (^aBlock)代表aBlock是变量名,而^则表示这个变量是block变量
d.同样,你也可以给参数起名字:
int (^aBlock)(int a,int b);
e.很多时候,我们需要将我们声明的block类型作为函数的参数,也有两种方式:
1、-(void)func:(int (^)(int a,int b))block;
f.第二种方式是通过typedef定义一种新的类型,这也是大多数情况下采用的方式:
2、typedef int (^myBlock)(int a,int b) ; -(void)func:(myBlock)block ;
2.block的创建
aBlock = ^(int num1, int num2){ return num1 * num2; };
a.num1代表参数1,num2代表参数2;
b.因为声明中有表示aBlock的返回值类型为int,所以需要返回一个int类型的数
return num1 * num2;
c.如果
void (^aBlock)(int, int);则代表无返回值,则不用
return num1 * num2;
上面还有简略写法(声明和创建一起来)
int (^aBlock)(int, int) = ^(int num1, int num2) { return num1 * num2; }; int sum = aBlock(10, 2); NSLog(@"%d", sum);
3.访问权限
__block int a = 10; //要加__block 或者 static int (^bBlock)(int) = ^(int num) { a++; /* (此处不能修改的原因是在编译期间确定的,编译器编译的时候把a的值复制到block作为一个新变量(假设是a‘ = 10),此时a'和a是没有关系的。这个地方就是函数中的值传递。如果要修改就要加关键字:__block或者static)*/ return num * a; }; int bsum = bBlock(2); NSLog(@"bsum= %d", bsum); //__block static 是拷贝a的指针,所以可以修改
4.回调的用法
block的回调太好用了,我们可以把耗时操作放在回调的主语部分,比如说网络请求数据的,我们可以把请求放在回调函数的”主语”部分,而获取数据部分放在回调函数的”实现”部分下面我将要说一个回调的简单demo(部分代码摘自网上)
详细回调介绍请查看我之前写的文章
在 demo之前说下
typedef 的用法
typedef void (^PresentAlertBlock)(); //typedef定义一种类型的别名,而不只是简单的宏替换,把PresentAlertBlock 这个block函数定义成一种类型
a. “主语”部分
// .h文件 typedef void (^PresentAlertBlock)(); //if改动1:typedef void (^PresentAlertBlock)(NSString* name); @property (nonatomic, copy) PresentAlertBlock PresentAlertBlock; -(void)startTimerCount;
//.m文件 - (void)startTimerCount { [NSTimer scheduledTimerWithTimeInterval:6.0f target:self selector:@selector(timeCount) userInfo:nil repeats:NO]; NSLog(@"回调1"); } //改动1:如果在定义属性,定义属性参数,那么可以通过这个传值,下面可以改动为 - (void)timeCount { if (self.updateAlertBlock) { self.updateAlertBlock(); NSLog(@"回调2"); } } /** - (void)timeCount { if (self.updateAlertBlock) { self.updateAlertBlock(@"回调啦啦啦"); NSLog(@"回调2"); } } */
“实现”部分
//.m文件 - (void)viewDidLoad { [super viewDidLoad]; //[self blockMethod]; [self blockMethod2]; } - (void)blockMethod2 { TimerController *timer = [TimerController new]; //同样,改动1: timer.updateAlertBlock = ^(NSString *name) {} timer.updateAlertBlock = ^(){ UIAlertController *alertcontro = [UIAlertController alertControllerWithTitle:@"点我" message:@"准备倒计时" preferredStyle:UIAlertControllerStyleAlert]; NSString *cancelButtonTitle = NSLocalizedString(@"Cancel", nil); NSString *otherButtonTitle = NSLocalizedString(@"OK", nil); UIAlertAction *cancleAction = [UIAlertAction actionWithTitle:cancelButtonTitle style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { NSLog(@"cancel。。"); }]; UIAlertAction *otherButttonAction = [UIAlertAction actionWithTitle:otherButtonTitle style:UIAlertActionStyleDefault handler:nil]; UIAlertAction *other2 = [UIAlertAction actionWithTitle:@"praise" style:UIAlertActionStyleDefault handler:nil]; [alertcontro addAction:cancleAction]; [alertcontro addAction:otherButttonAction]; [alertcontro addAction:other2]; [self presentViewController:alertcontro animated:YES completion:nil]; }; [timer startTimerCount]; }
本页demo代码 下载
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- 央视新闻报道XcodeGhost事件
- Ruby中Block和迭代器的使用讲解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- Lua中让回调函数支持回调对象方法的解决方法
- 原生JS仿苹果任务栏菜单,放大效果的菜单
- 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
- 谈谈JavaScript自定义回调函数
- C语言模块回调Lua函数的两种方法
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法