电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>C语言|源代码>如何扩展 Objective-C 语言

如何扩展 Objective-C 语言

2017-09-26 | rar | 0.3 MB | 次下载 | 2积分

资料介绍

  Variable Attributes 其实是 GCC 中用于描述变量的一种修饰符。我们可以使用 __attribute__ 来修饰一些变量来参与静态分析等编译过程;而在 Cocoa Touch 中很多的宏其实都是通过 __attribute__ 来实现的,例如:

  #define NS_ROOT_CLASS __attribute__((objc_root_class))

  而 cleanup 就是在这里会使用的变量属性:

  The cleanup attribute runs a function when the variable goes out of scope. This attribute can only be applied to auto function scope variables; it may not be applied to parameters or variables with static storage duration. The function must take one parameter, a pointer to a type compatible with the variable. The return value of the function (if any) is ignored.

  GCC 文档中对 cleanup 属性的介绍告诉我们,在 cleanup 中必须传入 只有一个参数的函数并且这个参数需要与变量的类型兼容。

  如果上面这句比较绕口的话很难理解,可以通过一个简单的例子理解其使用方法:

  void cleanup_block(int *a) {

  printf(“%d\n”, *a);

  }

  int variable __attribute__((cleanup(cleanup_block))) = 2;

  在 variable 这个变量离开作用域之后,就会自动将这个变量的指针传入 cleanup_block 中,调用 cleanup_block 方法来进行『清理』工作。

  实现 defer

  到目前为止已经有了实现 defer 需要的全部知识,我们可以开始分析 libextobjc 是怎么做的。

  在 libextobjc 中并没有使用 defer 这个名字,而是使用了 onExit(表示代码是在退出作用域时执行)

  为了使 onExit 在使用时更加明显,libextobjc 通过一些其它的手段使得我们在每次使用 onExit 时都需要添加一个 @ 符号。

  {

  @onExit {

  NSLog(“Log when out of scope.”);

  };

  NSLog(“Log before out of scope.”);

  }

  onExit 其实只是一个精心设计的宏:

  #define onExit \

  ext_keywordify \

  __strong ext_cleanupBlock_t metamacro_concat(ext_exitBlock_, __LINE__) __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^

  既然它只是一个宏,那么上面的代码其实是可以展开的:

  autoreleasepool {}

  __strong ext_cleanupBlock_t ext_exitBlock_19 __attribute__((cleanup(ext_executeCleanupBlock), unused)) = ^ {

  NSLog(“Log when out of scope.”);

  };

  这里,我们分几个部分来分析上面的代码片段是如何实现 defer 的功能的:

  1. ext_keywordify 也是一个宏定义,它通过添加在宏之前添加 autoreleasepool {} 强迫 onExit 前必须加上 @ 符号。

  #define ext_keywordify autoreleasepool {}

  2. ext_cleanupBlock_t 是一个类型:

  typedef void (^ext_cleanupBlock_t)();

  3. metamacro_concat(ext_exitBlock_, __LINE__) 会将 ext_exitBlock 和当前行号拼接成一个临时的的变量名,例如:ext_exitBlock_19。

  4. __attribute__((cleanup(ext_executeCleanupBlock), unused)) 将 cleanup 函数设置为 ext_executeCleanupBlock;并将当前变量 ext_exitBlock_19 标记为 unused 来抑制 Unused variable 警告。

  5. 变量 ext_exitBlock_19 的值为 ^{ NSLog(“Log when out of scope.”); },是一个类型为 ext_cleanupBlock_t 的 block。

  6. 在这个变量离开作用域时,会把上面的 block 的指针传入 cleanup 函数,也就是 ext_executeCleanupBlock:

  void ext_executeCleanupBlock (__strong ext_cleanupBlock_t *block) {

  (*block)();

  }

  这个函数的作用只是简单的执行传入的 block,它满足了 GCC 文档中对 cleanup 函数的几个要求:

  只能包含一个参数

  参数的类型是一个指向变量类型的指针

  函数的返回值是 void

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1储能电源市场分析
  2. 7.99 MB  |  6次下载  |  免费
  3. 2储能电源市场分析报告
  4. 2.61 MB   |  6次下载  |  免费
  5. 3具有DCS-Control™ 功能的 3V 到 17V 0.5A 降压转换器TPS6217x-Q1数据表
  6. 3.17MB   |  1次下载  |  免费
  7. 4磁环电感定制时应该注意什么
  8. 0.32 MB   |  1次下载  |  免费
  9. 5高效降压转换器 MicroSiP™模块TPS82084 (2-A)/TPS82085 (3-A)数据表
  10. 1.75MB   |  次下载  |  免费
  11. 6采用DSBGA封装的LMR24210 42V 输入电压、2A 降压稳压器数据表
  12. 1.82MB   |  次下载  |  免费
  13. 7采用增强型Hotrod™ QFN封装的TPSM560R6 60V输入、1V至6V输出、600mA 电源模块 数据表
  14. 2.06MB   |  次下载  |  免费
  15. 8具有外部参考输入的低引脚数、低VIN(3.0伏至5.5伏)同步降压DC-TO-DC控制器数据表
  16. 1.18MB   |  次下载  |  免费

本月

  1. 1ES9038PRO解码芯片的电路原理图介绍
  2. 0.25 MB   |  35次下载  |  5 积分
  3. 2UHD智能显示SoC VS680产品简介
  4. 0.46 MB   |  11次下载  |  免费
  5. 3STM32国内外发展现状
  6. 1.15 MB   |  11次下载  |  免费
  7. 4ATmega8芯片中文手册
  8. 2.45 MB   |  8次下载  |  1 积分
  9. 5TDK电容器产品指南
  10. 11.88 MB   |  7次下载  |  1 积分
  11. 616A 输出电流,高可靠、高效率 同步降压转换器PCD3201产品手册
  12. 0.47 MB   |  6次下载  |  免费
  13. 7传感芯片选型指南
  14. 3.60 MB   |  6次下载  |  免费
  15. 8储能电源市场分析
  16. 7.99 MB  |  6次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935086次下载  |  免费
  3. 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
  4. 1.48MB  |  420050次下载  |  免费
  5. 3Altium DXP2002下载入口
  6. 未知  |  233068次下载  |  免费
  7. 4电路仿真软件multisim 10.0免费下载
  8. 340992  |  191316次下载  |  免费
  9. 5十天学会AVR单片机与C语言视频教程 下载
  10. 158M  |  183316次下载  |  免费
  11. 6labview8.5下载
  12. 未知  |  81567次下载  |  免费
  13. 7Keil工具MDK-Arm免费下载
  14. 0.02 MB  |  73786次下载  |  免费
  15. 8NI LabVIEW中实现3D视觉的工具和技术
  16. 未知  |  70088次下载  |  免费