在运行时加载代码

你可能需要用到动态分享库,它能够保存可重用代码,在多个程序使用时有函数的使用优势。例如,当你开发Cocoa应用程序时,你的程序最少会链接Foudation和Application Kit框架。通过这个实践,当你的应用程序用户更新电脑系统软件框架时,你的程序能够自动利用那些改进的框架。
如果你开发shared libraries和作为framework bundles发布他们让其他开发者在他们的应用程序中使用,你必须保证你对那些库做出的改变不会破坏当前正在使用它们的应用程序。你在升级的shared libraries中通过暴露相同的程序接口给别的应用程序维持库的兼容性。
当你必须改变的你框架的api去实现一个新特性时,除了暴露出新的不同的api的框架新版本外,你能够利用同一个framework bundle中上个版本暴露出当前客户端需要的api的框架。如果你跟着这篇引导,客户端的开发者在你的框架每次升级都不需要修改他们的程序。并且选择升级他们应用程序的开发者也能利用你添加到框架中的特性。为了确保使用你早版本的框架的应用程序不会被框架升级而破环,你必须把shared libraries和它们的资源打包到一个framework bundle中,并且它能够更早版本的客户端程序能继续使用它们所知道的framework版本。
这篇文章描述了你在运行时如何加载代码,它说明了使用shared libraries的优势并且解释了他们是打包到frameworks时如何去维护框架升级后第三方应用程序的兼容性。

Using Shared Libraries and Frameworks

程序通常指使用了不同名字的dynamic shared libraries,如dynamically linked shared libraries,dynamic libraries, DLLs,dylibs or just shared libraries.在OS X里,所有这些名字指向同一件事:库里面的代码都是在运行时被动态地加载到进程中。
Dynamic shared libraries允许操作系统作为一个整体去有效地使用内存。每个OS X里的进程都有它自己的内存空间。OS X的内核允许逻辑内存区域映射到不同地址的多个进程中。Dynamic linker利用了这个特性的优势,通过反射相同只读的shared library代码到每个进程的地址空间中。这个结果意味着同时只有一个共享库的物理复制在内存中,尽管许多进程在同一时间使用它。Data,如变量和常量,它们都是被shared library包含的,都使用了内核的copy-on-write优化能力映射到每个程序进程中。使用了copy-on-write技术,直到一个进程尝试去改变数据之前,共享库里的数据都是被进程共享的,在这之后,内核创建一个可写的数据复制给修改它的进程。然后其他的进程继续去使用只读的shared copy(共享的复制数据)。因为,额外的保存数据的内存只会在必要的时候被申请。
Dynamic shared libraries同样也提供一个方法让程序从系统升级中无缝地获得利益,当系统升级后,shared libraries也升级了,但是程序不需要。因为他们是动态地绑定到shared libraries,程序能继续调用相同的函数并且升级了的shared libraries的实现被执行。 For more information on dynamic-library development and usage, seeDynamic Library Programming Topics

Maintaining Client Application Compatibility

这些是不同的能影响客户端程序兼容性的参数概览,你能够在构建期间设置这些参数。seeDynamic Library Programming Topics

Shared libraries有两个版本数字,它们允许你创建二进制兼容的共享库版本(就是他们不需要客户端程序重新被编译)的函数导出的早期版本库:

  1. library的当前版本定义了定义了library实现的当前版本数字。一个客户端程序能够检测这个版本数去找出library的实际版本,它能够有用于去检测大的修改和额外添加特性。Shared library同样能够检测客户端程序最初链接的版本号,这能有利于维护后向兼容性。
  2. library的兼容性版本定义了library的API版本,它是shared library要求是后向兼容的版本。如果shared library的兼容性版本号比记录在客户端程序中的版本号更接近,这个程序将会链接失败并且报出错误。
    安装的名字是一个用于动态链接器在运行时去查找shared library的路径,这个安装名字是被shared library定义的,并且在之后通过静态链接器记录在客户端程序中。

这篇文章接下来关于打包framework的过程,有兴趣的读者请到官网链接下继续学习