资料介绍
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
- YCMatrix objective-C矩阵库 0次下载
- RuntimeSummary objective-C Runtime使用的Playground 1次下载
- TYPEC转HDMI+PD3扩展坞方案电路图 26次下载
- 使用单片机实现62256扩展内存的C语言程序免费下载 12次下载
- 如何从Java转型Objective-C的详细资料分析 2次下载
- Objective-C与Runtime的详细资料介绍让你不在问为什么 3次下载
- ObjectiveC-Class-Ivar-Layout的使用方法详解 2次下载
- objective-c简体中文手册 14次下载
- 基于Objective-C实现动态加载 2次下载
- 从Objective-C向Swift转换经验分享 0次下载
- 第15章objective-C编程语言 0次下载
- Objective-C基础教程 2次下载
- Objective-C.2.0程序设计(原书第2版).(美)St 0次下载
- Objective-C入门指南(中文全套资料) 0次下载
- Learn Objective-C(zh)(v2)中文资料 0次下载
- fpga语言是什么?fpga语言与c语言的区别 174次阅读
- plc编程语言与c语言的联系 c语言和PLC有什么区别 534次阅读
- vb语言和c++语言的区别 383次阅读
- 静态分析工具 2005次阅读
- C语言语法扩展 609次阅读
- OLLVM和LLVM功能介绍 5426次阅读
- C语言的诞生 C语言与C++40年的相爱相杀 1213次阅读
- 面向未来的五款编程语言 1720次阅读
- C语言的简介和特点说明 7499次阅读
- 程序员学习Julia编程语言的五个理由 3730次阅读
- 2019年的编程语言排行榜你知道吗 2.4w次阅读
- 你想知道的Ocaml语言 6233次阅读
- 51单片机资源扩展:扩展片外RAM 1.6w次阅读
- 高级语言和汇编语言_机器语言的区别 2.9w次阅读
- r语言是什么_r语言基础教程 9610次阅读
下载排行
本周
- 1储能电源市场分析
- 7.99 MB | 6次下载 | 免费
- 2储能电源市场分析报告
- 2.61 MB | 6次下载 | 免费
- 3具有DCS-Control™ 功能的 3V 到 17V 0.5A 降压转换器TPS6217x-Q1数据表
- 3.17MB | 1次下载 | 免费
- 4磁环电感定制时应该注意什么
- 0.32 MB | 1次下载 | 免费
- 5高效降压转换器 MicroSiP™模块TPS82084 (2-A)/TPS82085 (3-A)数据表
- 1.75MB | 次下载 | 免费
- 6采用DSBGA封装的LMR24210 42V 输入电压、2A 降压稳压器数据表
- 1.82MB | 次下载 | 免费
- 7采用增强型Hotrod™ QFN封装的TPSM560R6 60V输入、1V至6V输出、600mA 电源模块 数据表
- 2.06MB | 次下载 | 免费
- 8具有外部参考输入的低引脚数、低VIN(3.0伏至5.5伏)同步降压DC-TO-DC控制器数据表
- 1.18MB | 次下载 | 免费
本月
- 1ES9038PRO解码芯片的电路原理图介绍
- 0.25 MB | 35次下载 | 5 积分
- 2UHD智能显示SoC VS680产品简介
- 0.46 MB | 11次下载 | 免费
- 3STM32国内外发展现状
- 1.15 MB | 11次下载 | 免费
- 4ATmega8芯片中文手册
- 2.45 MB | 8次下载 | 1 积分
- 5TDK电容器产品指南
- 11.88 MB | 7次下载 | 1 积分
- 616A 输出电流,高可靠、高效率 同步降压转换器PCD3201产品手册
- 0.47 MB | 6次下载 | 免费
- 7传感芯片选型指南
- 3.60 MB | 6次下载 | 免费
- 8储能电源市场分析
- 7.99 MB | 6次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935086次下载 | 免费
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420050次下载 | 免费
- 3Altium DXP2002下载入口
- 未知 | 233068次下载 | 免费
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191316次下载 | 免费
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183316次下载 | 免费
- 6labview8.5下载
- 未知 | 81567次下载 | 免费
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73786次下载 | 免费
- 8NI LabVIEW中实现3D视觉的工具和技术
- 未知 | 70088次下载 | 免费
评论
查看更多