库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。
如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用。
重用代码的最简单方法是简单的 拷贝/粘贴 源文件。然而,这种方法很快就会成为维护时的噩梦。因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步。
这就是静态库要拯救你的。一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享。
一.创建.a静态库
1.
2.添加自己的源代码 将公开的接口置于.h文件中 实现置于.m文件
3.在.a库的showinfindjr中可以找到 include 和 对应的 .a文件
4.
默认情况下,库文件只会为当前的架构构建 所以要使用
通用二进制 来使
支持多个平台
4.1
通用二进制是一种特殊的二进制文件,它包含对应多个架构的结果代码。
为了创建通用二进制库,需要使用一个名为lipo的系统工具
lipo是一个命令行工具,它允许在通用文件上执行操作(类似于创建通用二进制, 列出通用文件内容等等)。本教程中使用lipo的目的是联合不同架构的二进制文件到单个输出文件中。你可以直接在命令行中使用lipo命令,但在本教程中你可以让Xcode执行一段创建通用库的命令行脚本来为你做这件事。
4.2
4.3
在工程导航视图中选中ImageFilters,然后选择UniversalLib目标。切换到Build Phases标签;在这里设置构建目标时将要执行的动作。
点击Add Build Phase按钮,在弹出的菜单中选择Add Run Script,如下图:
4.4 原理 :;
现在你需要设置脚本项。展开Run Script模块,在Shell行下粘贴如下代码:
- # define output folder environment variable
- UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
- # Step 1. Build Device and Simulator versions
- xcodebuild -target ImageFilters ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
- xcodebuild -target ImageFilters -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
- # make sure the output directory exists
- mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
- # Step 2. Create universal binary file using lipo
- lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"
- # Last touch. copy the header files. Just for convenience
- cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
代码并不十分复杂,它是这样工作的:
UNIVERSAL_OUTPUTFOLDER 包括了通用二进制包将要被存放的文件夹:“Debug-universal”
Step 1. 第2行执行了xcodebuild并命令它构建ARM架构的二进制文件。(你可以看到这行中的-sdk iphoneos参数)
下一行再次执行了xcodebuild命令并在另一个文件夹中构建了一个针对Inter架构的iPhone模拟器的二进制文件,在这里关键参数是-sdk iphonesimulator -arch i386。(如果感兴趣,你可以在man page了解更多关于xcodebuild的资料)
Step 2. 现在已经有了2个.a文件分别对应两个架构。执行lipo -create,用它们创建出一个通用二进制。
最后一行的作用是复制头文件到通用构建文件夹的外层。(用cp命令)
你的Run Script窗口应该看起来如下:
4.5
现在你已经准备好构建一个静态库的通用版本
5 在应用中使用静态库
有两种办法可以将静态库引入到工程中:
方法 1: 直接引用头文件和库二进制文件(.a)
方法 2: 将库工程作为子项目
方法 1: 头文件和库二进制文件
1.用showinfound开自己创建的静态库 将里面的.h 和 .a 文件赋值到新项目的实体文件中去 再通过下面的方法来设置路径来实现对静态库的调用
注意:
标准的Unix引入惯例是一个include文件夹,用来存放头文件,一个lib文件夹用来存放库文件(.a)
2.添加头文件的搜索路径
Header Search Path
双击Header Search Paths项,弹出一个浮动窗口,点击+按钮,输入:
- $SOURCE_ROOT/include
$SOURCE_ROOT
是一个Xcode环境变量,指向工程根文件夹。Xcode会使用包含你工程的实际文件夹代替此变量,这意味着即使你把工程移动到其它文件夹或驱动器,它仍然可以指向最新的位置。
3.添加包含类实现的库文件
该链接尝试更高效的只包含需要的代码,而有时会排除静态库代码。使用该标识,库中的所有Objective-C类和类别都将被适当的加载。你可以从苹果的
Technical Q&A QA1490
了解详细信息。
4.在 Other linker Flags
增加-ObjC链接标识
方法 2: 将静态库作为子项目添加到新的项目中
1.将自建的库工程文件的
.xcodeproj文件,
拖拽它到新工程左侧的导航栏中
2.为工程添加依赖关系
3.设置静态库工程链接到应用
4.在 Other linker Flags
增加-ObjC链接标识