什么是库?
库是程序代码的集合,是共享程序代码的一种方式
根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking
闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库
静态库和动态库的存在形式
静态库:.a 和 .framework
动态库:.dylib 和 .framework
静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
需要注意的是:
项目中如果使用了自制的动态库,不能被上传到AppStore
静态库制作
编写业务类:
// // HJTool.h // static // // Created by HJiang on 15/3/23. // Copyright (c) 2015年 HJiang. All rights reserved. // #import <Foundation/Foundation.h> @interface HJTool : NSObject + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2; @end
// // HJTool.m // static // // Created by HJiang on 15/3/23. // Copyright (c) 2015年 HJiang. All rights reserved. // #import "HJTool.h" @implementation HJTool + (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2{ return num1 + num2; } @end
编译项目:
command+B,得到.a和暴露的.h文件
新建测试静态项目
测试通过
使用模拟器iphone4s测试
解决办法:
方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件)
项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO 方法2:把i386和x86_64的2个静态库文件合成一个静态库使用 静态库的合并 ================================================================================ # 检测.a的类型 $ lipo -info libHJTools.a # 合并.a lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试 # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的 # 今后在使用.a时一定注意版本
把静态库项目配置修改重写编译
重写导入新的.a文件运行在iphone4s正常
/*
Undefined symbols for architecture i386:
静态库不能在使用i386架构的cpu设备上面运行
模拟器架构:
i386 : iPhone模拟器 3gs->iPhone5
x86_64 : iPhone模拟器 5s->6plus
查看.a架构命令
lipo -info 静态库:查看该静态库支持哪些架构
真机架构
armv7 : iPhone 3gs->4s
armv7s : iPhone 5->5c
arm64 : iPhone 5s->6plus
*/
笔记:
问题一: 静态库.a文件始终为红色,显示编译不成功。 解决办法:这是xcode的一个bug,先将编译模式设置为device,编译成功,再切换回simulator模式即可编译simulator对应的.a文件 新建静态库项目 1.编译项目,获取.a文件,如需暴露.h文件,再项目->target->Build Phases->Copy Files->导入需要暴露的头文件和.m文件(一般只暴露.h文件) 在其他项目中导入静态库就可以使用静态库 2.如果是生成的x86_64的静态库,在i386处理器上运行会出现异常 解决办法: 方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件) 项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO 方法2:把i386和x86_64的2个静态库文件合成一个静态库使用 静态库的合并 ================================================================================ # 检测.a的类型 $ lipo -info libHJTools.a # 合并.a lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a # 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试 # 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的 # 今后在使用.a时一定注意版本 3.生成调试和正式版本 选择项目 > Edit Scheme >Run > info >Build configuration >Debug|Release 这样选择后就可以生成调试或正式版本(发布或调试).a信息
静态库的种类
================================================================================
静态库文件的版本(4种)
1.真机-Debug版本
2.真机-Release版本
3.模拟器-Debug版本
4.模拟器-Release版本
调试版本(Debug版本) VS 发布版本(Release版本)
--------------------------------------------------------------------------------
- 调试版本会包含完整的符号信息,以方便调试
- 调试版本不会对代码进行优化
- 发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
- 在执行速度方面,调试版本会更快些,但不意味着会有显著的提升
二.在application项目中添加静态库项目 1.项目- >Target>左下角 添加静态库项目> 2.项目-》target>添加frameWork(指定.a文件) 动态库 1.新建动态库 2.添加动态库至项目中 2.1 修改动态库的导入 - 删除target>general>Linked framework 添加二进制文件 ->Embedded Binaries >导入动态库 #warning 在制作库时,图片等资源不会包括在.a库中(所以制作库时,库中使用到的资源也需要单独和库一起发布出来) 需要在导入库到项目中时还需要导入资源文件 资源文件需要库提供者一起提供出来
静态库中的资源包的使用
================================================================================
问题:有些第三方库会使用到一些图片素材,例如公司的logo等。
但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle
Bundle资源 怎么制作bundle? 新建文件夹>把文件夹后缀修改为Bundle 显示bundle文件内容,把资源放入就可以了