转:http://tigercat1977.blog.163.com/blog/static/2141561122012111295955891/
第十讲:Obj-C Blocks 应用
2012-12-12 09:59:55| 分类: Objective-C | 标签:objective-c |字号大中小 订阅
Blocks 是什么
Blocks 和 C 语言函数指针区别
如何调用 Blocks
代理两端如何通过 Blocks 通讯
什么是 Blocks
Blocks 是一个 C Level 的语法以及运行时的一个特性,和标准 C 中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从 IOS 4.0 开始就很好的支持 Block。
Blicks typedef 定义
C语言函数指针 typedef
typedef int (*SumBlockT)(int a, int b);
Block typedef 定义
typedef int (^SumBlockT)(int a, int b);
__block 关键字
一个Block 的内部是可以引用自身作用域外的变量的,包括 static 变量,extern 变量或自由变量 ( 定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量 auto , auto 变量保存在 stack 中的, 除了 auto 之外还存在 register , static 等存储修饰符 ), 对于自由变量,在 Block 中是只读的。在引入 block 的同时,还引入了一种特殊的 __block 关键字变量存储修饰符
Blocks 简单用法举例
// main.m
#import <Foundation/Foundation.h> // 定义 Blocks 的 typedef typedef int (^SumBlockT) (int a, int b); int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); void (^myblocks) (void) = NULL; myblocks = ^(void){ NSLog(@"in blocks"); }; // 给 myblocks 赋值 NSLog(@"before myblocks"); myblocks(); // 执行 myblocks; NSLog(@"after myblocks"); /* 输出结果: Hello, World! before myblocks in blocks after myblocks */ int (^myblock2) (int a, int b) = ^(int a, int b){ int c = a + b; return c; }; NSLog(@"before block2"); int ret = myblock2(10,20); NSLog(@"after block2 ret %d", ret); /* 输出结果: before block2 after block2 ret 30 */ __block int sum = 0; // 调用外部变量 需要使用 __block 存储修饰符 int (^myblocks3) (int a, int b) = ^(int a, int b){ sum = a+b; return 3; }; myblocks3(20, 30); NSLog(@"sum is %d", sum); /* 输出结果: sum is 50 */ // 前面定义 Blocks 的 typedef SumBlockT SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"c is %d", a+b); return 0; }; myblocks4(50, 20); /* 输出结果: c is 70 */ } return 0; }
Blocks 案例