Framework学习

前言

在学习Standord的Swift课程时,教师提供了一个Twitter framework。于是,抽空看了下framwwork的guide。因为Xcode早就提供了framwwork的模版,这里不将如何构建一个framework作为重点,也不会涉及如何设计一个framework,而主要关注Apple的framework的一些特点。

Framework Versions

这个概念能帮助你如何定义你的框架版本。

Major Versions 主版本

和兼容性有关,一旦lib在新version下运新,会runtime error。 frame /System/Library/Frameworks/Boffo.framework/Versions/A/Boffo
此处主要正对OS X系统。

当程序编译的时候,链接器在可执行文件中记录该路径。动态编辑器在运行时使用该路径找到兼容的框架的库版本。因此,主版本控制着框架的后向兼容性。
几个重要原则:

  • 添加实例或结构体等都需要修改主版本
  • 保留不用的接口(避免删除),并返回一个有意义的结果。
  • 仅添加接口,不需要更改主版本。

Minor Versions次版本

又叫兼容版本,不改变公共接口,但可以增加接口或是改变实现方式

Frameworks and Binding

框架如何和程序一起工作。

Dynamic Shared Libraries 动态共享库

框架中的可执行代码即为动态共享库,它有几个好处:

  • 高效使用内存:链接到该库的程序共享使用一个副本
  • 易于修复bugs:依赖于该框架的程序不需要重新编译打包

Symbol Binding 符号绑定

对于静态共享库,符号是在链接的时候检查的,如果链接器没有找到,就会报错。而对动态共享库,符号是在执行的时候才绑定。而且动态链接器只在符号被引用的时候才去解析符号。该特性依赖于Mach-O动态共享库的内部结构。

Frameworks and Weak Linking

如果程序使用了框架中的新功能,那么老版本程序运行就会出错。解决方案是弱链接,这样当程序运行时用到了弱链接的符号,程序“忽略”该符号的引用而继续运行。如果弱链接的符号存在,那么程序则正常运行。 可以使用Apple定义的宏来确定符号是否弱链接,而对于框架可以使用 weak_import 关键字来标记符号能否被弱链接。

extern int MyFunction() __attribute__((weak_import));
extern int MyVariable __attribute__((weak_import));

尤其需要注意的是,程序中判断弱链接的符号是否存在时,必须和NULL或nil进行比较。 框架的弱链接,可以使得所有的符号都是弱链接。