然后我就开始各种百度 && google了。。。。(原谅我这个iOS开发新人吧)
功夫不负有心人,终于找到了两种:分别是framework 和 .a
读了 《iOS 静态库开发》获益匪浅,就仿照做了下面例子
一、基础信息展示
1、静态库与动态库的区别:
静态库:连接时完整的拷贝至可执行文件中,被多次使用就有多分冗余拷贝。
动态库:连接时不复制,程序运行时由系统动态加载到内存中,共程序调用,系统只加载一次,多个 程序公用,节省内存。
2、iOS中库的形式:
iOS中静态库的形式:.a 和 .framework(自建)
iOS中动态库的形式: .dylib 和 ,framework(系统)
3、.a 和 .framework的区别:
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。
.a 文件不能直接被使用,需要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourcefile = .framework。
这里面有个问题。就是感觉.framework既然除了存放.m和.h文件 又能存放各种图片或者其他资源文件。为什么很多
第三方sdk 很多都使用的是 静态库+ bundle?
后来查资料发现,系统是不会去扫描.framework下的图片等资源文件。也是不会在项目中显示,也就
是说framework中的资源只是被framework中文件自己调用,第三方sdk将资源图片打包为bundle 是方便了公开调用,
近而解决静态库中图片等资源不能使用的问题。
4、编译模式
Debug-iphoneos 真机
Debug-iphonesimulator 模拟器
5、debug 和 release的区别
Debug(调试)版本
1.含完整的符号信息,以方便调试
2.不会对代码进行优化
Release(发布)版本
1.不会包含完整的符号信息
2.的执行代码是进行过优化的
3.的大小会比Debug版本的略小
4.在执行速度方面,Release版本会更快些(但不意味着会有显著的提升)
二、生成静态库代码模块
我使用的是Xcode7,好!让我们开始:
新建一个静态库的项目。
给项目起个名字,会生成如下的结构
其中Copy Files 中的.h文件是暴露在外面的,供外部方法调用,如果你要是新建了类文件并且希望能被外部调用,就把.h 文件放在这里。
#import <UIKit/UIKit.h>
@interface testPlugin : NSObject
-(void )showParam:(NSString *)param;
-(NSString *)showParams:(NSString *)param;
@end
</span>
testPlugin.m 代码
#import "testPlugin.h"
@implementation testPlugin
-(void )showParam:(NSString *)param{
NSLog(@"%@",param);
}
-(NSString *)showParams:(NSString *)param{
NSString *param2 = [param stringByAppendingString:@"_test"];
return param2;
}
@end</span>
现在是重头戏,就是要开始编译,之前自己在这个地方进坑
跳出一大堆无关紧要的,直接做通用版本的:
选择iOS Driver 和 simulators 运行编译,
按照上述的操作,进入到该文件夹可以发现真机和模拟器编译好的 .a静态库文件和 include文件 (文件夹里就是要暴露在外的.h的文件)
这时候需要将两个文件合并
找到两个.a静态包的地址 然后合并
lipo -create 完整路径/xxx.a 完整路径/xxx.a -output xxx.a
你是在什么目录下执行该条命令 新生成静态包就是在当前目录,可以在output 后面加上路径
这个是在debug模式下两个包合并,应该不能跟release 版本混在一起合并(这部分没有测试)
最后 你所有需要的通用静态库文件 + 之前的 .h文件 就成功了。
ps:网上也有一种是在xcode中使用shell 脚本,这个也是可以的。引用《在iOS中创建静态库》
具体如下:
当前项目下new /Target 并且在Other 地方选择Aggregate
点击next 随便起个名字,不过需要确保 Project 是当前的项目
# 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}/"</span>