• 第十讲: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


  • 相关阅读:
    九九乘法表及双色球
    错误 “SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, ie浏览器兼容问题
    隐藏ie input的X和眼睛图标
    vue-cli解决兼容ie的es6+api问题
    git 本地tag和远程tag对应不上 vscode里pull不下代码
    git 计算commit
    git 查看对比的方法log diff
    git 版本回退方法
    git rebase的使用
    git 常规操作
  • 原文地址:https://www.cnblogs.com/jackljf/p/3589247.html
Copyright © 2020-2023  润新知