如前文所说Mac OS X的框架也是一种特殊的bundle。框架中通常包含一个或多个动态链接库和其他的必要文件。框架通常包含以下资源
- 动态链接库
- 头文件
- Nib(NeXT Interface Builder)文件
- 本地化文件
- 图片
- 文档
- Info.plist
- 音频文件
一个框架通常有着清晰的结构,有些是系统强制的,另一些是出于习惯或约定。例如有一个Foo.framework,那么它的结构应该是这样的

在Resources目录里的Info.plist包含了框架的信息。框架可以带版本,意味着如果一个应用程序需要一个特定版本的框架,那系统需要包含相同或兼容的版本号的框架才能运行。通常大版本更新都意味着不兼容,而小版本之间可以相互兼容。一个框架可以有多个大版本,例如Foo有两个版本,A和B。另外框架还有一个符号链接Current指向最新的大版本。如果不指定版本系统将使用Current指向的动态链接库。
一个框架可以包含其他的子框架,这种框架叫umbrella framework。Umbrella framework可以隐藏内部复杂的依赖关系,对外看起来就像一个大框架。Umbrella framework的文件结构和上文中普通的框架类似,但有一个额外的子目录Framework,就是包含子框架的目录。通常程序员不会专门要求链接器链接到一个子框架,也不需要知道自己使用的框架是不是umbrella framework。使用umbrella framework时会自动暴露所有子框架的API。如果动态链接器遇到一个umbrella framework中的符号,它会自动搜索所有的子框架去寻找这个符号。
框架也可以是私有private的,意味着第三方程序员不能使用这个框架。Mac OS X有一些私有框架,包含在/System/Library/PrivateFrameworks/目录。例如DiskImages.framework就是其中之一。这些框架的不同之处在于
- 苹果不会说明这些框架的API,甚至不会公布它们的头文件
- 默认情况下第三方程序员不能链接到这些框架,然而如果提供给链接器完整的路径,这些框架还是可以被链接的。然而苹果不会给予这种链接方法任何支持
当一个使用动态链接的程序编译后,动态链接库的路径就会被编译进程序。通常使用系统框架的会使用绝对路径表示。除此之外第三方应用可以自带框架存储在它们的bundle中,这些框架可以使用相对路径表示。