一、静态库架构问题
不同设备使用的CPU不同,从而使用的CPU架构(指令集)也不同,静态库有其支持的CPU架构,若静态库在不支持的CPU架构上运行程序就会崩溃。
1、模拟器使用的CPU架构:
iphone4s - iphone5 : i386
iPhone5s - iPhone7plus :x86_64
2、真机使用的CPU架构:
iPhone3gs - iPhone4s:armv7
iPhone5 - iPhone5c:armv7s
iPhone5s - iPhone7plus:armv64
注意:只要支持armv7的静态库可以就可以在armv7s上正常运行,因为armv7兼容armv7s.
3、查看静态库支持的架构:lipo -info 静态库名称
4、合并静态库:lipo -create 静态库1 静态库2 -output 合并后的静态库名称
二、静态库简介
什么是库:库是程序代码的集合,是共享程序代码的一种方式。根据源代码的公开情况,库可以分为2种类型:开源库、闭源库。
开源库:作者公开源代码,能够看到代码的具体实现,如AFNetworking、MJExtension等。
闭源库:作者不公开源代码,是经过编译后的二进制文件,看不到具体实现。如百度地图、高德地图等
闭源库分两种:静态库和动态库
静态库:以.a和.framework两种形式存在
动态库:以.dylib和.frmaework两种形式存在
静态库和动态库使用上的区别
静态库:使用时静态库会被完整的复制到可执行文件中,使用多少次就会拷贝多少份,这样会造成冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
从上面可以看出,动态库的使用会更好的节省内存,优化性能。但是苹果规定 项目中不能使用自制的动态库,否则不能上架到AppStore。
静态库的种类:
1、真机-Debug版本
2、真机-Release版本
3、模拟器-Debug版本
4、模拟器-Release版本
调试版本(Debug版本) 和 发布版本(Release版本)的区别:
1、调试版本会包含完整的符号信息,以方便调试,
2、调试版本不会对代码进行优化,
3、 发布版本不会包含完整的符号信息,
4、发布版本的执行代码是进行过优化的,
5、发布版本的大小会比调试版本的略小,
6、 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升。
三、.a形式的静态库制作
1、打开Xcode -> create a new Xcode project -> framework & Library -> Cocoa Touch Static Library 创建.a形式的静态库。
2、直接选择模拟器然后command+B运行,就可以生成模拟器版静态库。但是在此之前一定要将Build Settings-Architecures-Build Active Architecture Only致为NO(如下图),这样才能保证模拟器版的静态库支持i386 和x86_64架构。真机版的静态库直接选择真机然后command+B运行就可以得到。这样得到的都是Debug版本的静态库。
release版本静态库:点击项目名称选择Edit Scheme,进入到如下界面。设置为release,分别在模拟器和真机下command+B运行就可得到release版本的静态库。
3、暴露静态库的.h文件
4、查看静态库支持的架构。在项目有个Products文件夹,它里面会有一个小房子样式的.a文件,右键show in Finder,就可以找到生成的静态库。在终端查看所支持的架构
5、合并模拟器版和真机版的静态库
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的。
6、将静态库拖入到项目中,导入头文件就可以使用了。
静态库中BuyProduct.h文件
#import
@interface BuyProduct : NSObject
+ (void)buyProduct:(NSString *)product;
@end
静态库中BuyProduct.m文件
#import "BuyProduct.h"
@implementation BuyProduct
+ (void)buyProduct:(NSString *)product
{
NSLog(@"%@", product);
}
@end
导入项目中后使用静态库
三、.framework形式的静态库制作
这里只介绍和.a静态库不同的地方,其他参考上述内容
1、系统默认创建的.framework形式的库是动态库,所以要做如下修改确保生成的而是静态库。
2、暴露.h文件
3、.framework静态库会自动创建一个主头文件,将你需要暴露的借口文件(.h)包含在主头文件下,别人用你的静态库只需要导入主头文件就可以。
四、开发静态库
创建你所需要的静态库(.a或.framework),这样就可以边调试,边开发静态库。
坑
1、自己制作静态库在xcode上跑没问题,打包就报错,解决办法在这
http://blog.csdn.net/tooles/article/details/52330466