第十讲:ObjC Blocks 应用

转: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。
    第十讲:Obj-C Blocks 应用 - tigercat1977 - tiger notes

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 案例
    第十讲:Obj-C Blocks 应用 - tigercat1977 - tiger notes


原文地址:https://www.cnblogs.com/jackljf/p/3589247.html