Xummer

iOS上创建静态库(static library)

创建Static library

英文好的直接可以看这两个
Apple官方文档
Raywenderlich教程(貌似被 和™谐 了)

创建新的Lib Target

Cocoa Touch Static一路next

创建好之后,你会有2个由Xcode自动生成的文件在新的target中, ImageFilters.hImageFilters.m,不需要的话直接删掉就好。

然后按照下图的要求把文件文件添加到Build Phases的子项下

  • 需要编译的.m文件加到Compile Sources
  • 需要被其他工程include的.h文件加到Copy Files

编译标记

非arc.m加入到arc
-fno-objc-arc

arc.m加入到非arc
-fobjc-arc

更简单的方式创建Universal Lib

编译目标架构

Static library是编译后的文件的打包,在编译时,需要选择目标芯片类型(i386, armv6, armv7, armv7s, arm64), 选定了芯片架构的lib只能跑在符合该芯片架构的设备上。如,i386对应Intel的CPU,也就是Xcode中的iOS模拟器。
lipo -info命令可以查看.a所对应的芯片架构。
lipo命令可以将多个不同架构的.a文件合成一个,只需要导入这一个.a就可以跑模拟器和真机。

Aggregate Target

Aggregate Target是用于聚合多个target们的Target,我们可以用它来生成多个芯片架构的lib。

添加run script

添加universal lib 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}/"

执行完后,点新生成的.a文件 Show in Finder,可以看到多了个文件夹Debug-universal,下面有一个合并好的fat lib(导入到其他工程中的.a

创建bundle

用于存放图片资源以及nib(xib)文件。

只有mac下有bundle

新建一个会多一些mac的类库,删除就好

把需要的资源文件加到bundle的Copy Files中。

如果nib中有引用图片的,默认是在和nib同一个bundle下找。

IB或代码设置读取其他bundle的图片

myImageView.image = [UIImage imageNamed:@"MyBundle.bundle/picture1.png"];

导入其他工程

.a文件、需要被导入的头文件.h以及bundle文件拖到需要导入的工程中

检查下.a文件是否存在于Link Binary With Libarries, 不存在的话手动添加(Xcode 5.1 拖进去自动添加)

检查下bundle文件是否存在于Copy Bundle Resources, 同样,不存在的话手动添加

xxx.h not found

头文件找不到,添加header search path

Category in static library

如果lib中有使用Category,在导入其他工程后会报错,找不到Category的方法。

+[UIImage libImageNamed:]: unrecognized selector sent to class 0x3982df88

添加Other Linker Flags: -ObjC

-ObjC具体表示的含义 -来自SO

-all_load Loads all members of static archive libraries.

-ObjC Loads all members of static archive libraries that implement an Objective-C class or category.

-force_load (path_to_archive) Loads all members of the specified static archive library. Note: -all_load forces all members of all archives to be loaded. This option allows you to target a specific archive.

几个好用的category UIImage+bundle

-以上-