Objective - C基础: 第六天 - 4.block数据类型
来源:互联网 发布:展动力怎么样 知乎 编辑:程序博客网 时间:2024/05/29 09:11
在前面我们讲过许多数据类型, 比如基本数据类型, 枚举, 结构体等等, 这次我们来讲最后一个OC中的最后一个数据类型, 那就是block, 在OC开发中,block有些类似函数指针, 但又不完全一样, 下面让我们来看看:
例子:
#import <Foundation/Foundation.h>int sum(int a, int b){ return a + b;}int main(int argc, const char * argv[]){ int (*p) (int, int) = sum; int a = p(10, 20); NSLog(@"a = %d", a); return 0;}
打印出来的结果:
2015-01-29 16:05:21.315 3.block[3436:296165] a = 30
这个就是我们以前所写的函数指针, 利用函数指针来进行一些别的操作, 下面我们来看看block的例子:
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){ int (^sumBlock)(int, int) = ^(int a, int b) { return a + b; }; NSLog(@"sum = %d", sumBlock(10, 2)); return 0;}
结果:
2015-01-29 16:06:12.122 3.block[3448:296785] sum = 12
block其实还可以设置无参数类型, 比如:
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){ void (^Myblock)() = ^{ NSLog(@"我是一个block."); }; Myblock(); return 0;}
打印出来的结果:
2015-01-29 16:07:54.362 3.block[3457:297419] 我是一个block.
block还可以嵌套循环使用, 比如:
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){ void (^Myblock)(int) = ^(int n ){ for (int i = 0; i < n; i++) { NSLog(@"我是block"); } }; Myblock(5); return 0;}
打印出来的结果:
2015-01-29 16:29:46.207 3.block[3510:305285] 我是block2015-01-29 16:29:46.207 3.block[3510:305285] 我是block2015-01-29 16:29:46.208 3.block[3510:305285] 我是block2015-01-29 16:29:46.208 3.block[3510:305285] 我是block2015-01-29 16:29:46.208 3.block[3510:305285] 我是block
这种用法看上去好像似曾相识, 其实和函数的调用方法很类似, 但block的效率比函数的要高, 所以apple官方非常推荐我们使用block.
block也还可以使用typedef定义, 比如:
#import <Foundation/Foundation.h>typedef int (^MyBlock)(int, int);int main(int argc, const char * argv[]){ MyBlock sumBlock = ^(int a, int b) { return a + b; }; NSLog(@"sum = %d", sumBlock(100, 200)); return 0;}
打印出来的结果:
2015-01-29 16:34:51.012 3.block[3526:307912] sum = 300
看了那么多的好处, 那么block是不是真的是百分百好呢, 其实不以为然, 使用block也有注意事项, 下面我们来看看:
这样子是不可以直接修改局部变量的, 会报错:
Variable is not assignable (missing __block typer specifier)
如果要在block里面修改局部变量, 那么必须得加上__block:
#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){ __block int a = 10; void (^Myblock)() = ^{ a = 20; }; return 0;}
还有更多的block使用方法就让大家慢慢去挖掘吧~~~这次就讲到这里, 下次我们继续~~~
0 0
- Objective - C基础: 第六天 - 4.block数据类型
- objective-c基础之block
- Objective-c的Block基础
- Objective - C基础: 第六天 - 3.ARC循环引用
- Objective-C基础笔记(6)Block
- Objective-C基础——block
- Objective-C基础—变量和数据类型
- objective-c block 讲解
- objective-c block 讲解
- objective-c block 详解
- objective-c block 讲解
- objective-c block 讲解
- Objective-C block
- objective-c block 详解
- objective-c block 详解
- Objective-C中的Block
- Objective-C中的Block
- objective-c block 详解
- 程序猿自测的重要性(职业素养必备)
- 简单线程
- JS Map 和 List 的简单实现代码
- c标准库 signal 库
- CAD控件:Qt中使用控
- Objective - C基础: 第六天 - 4.block数据类型
- 微信支付之关闭订单
- Emacs 设置 Python 编辑模式下的自动补全
- Android系统自带样式(@android:style/) (转)
- Path动画--书写文字的动画实现
- 敏捷开发之Scrum扫盲篇
- eclipse连接hadoop报错Unknown protocol to job tracker: org.apache.hadoop.hdfs.protocol.ClientProtocol
- Capturing self strongly in this block is likely to lead to retain cycle
- SSH项目中,hql语句和sql语句的区别?