1、库?
库是共享代码的方式,一般分为动态库和静态库。
2、静态库和动态库的区别?
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
3、iOS里静态库的形式
.a 和 .framework
4、iOS里动态库的形式
.dylib 和 .framework
5、framework为什么既是静态库又是动态库?
系统的.framework是动态库,我们自己建立的.framework是静态库。
6、.a 和.framework有什么区别?
.a是一个纯二进制文件,.framework中除了二进制文件还有资源文件。
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。
.a + .h + sourceFile = .framework
建议使用.framework
7、为什么使用静态库?
*方便共享代码,便于合理使用
*实现iOS程序的模块化。可以把固定的业务模块化成静态库。
*和别人分享你的代码库,但不想让别人看你的代码实现。
*开发第三方SDK的需要。
8、制作静态库几点注意
*图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundel文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容就可以向其中添加图片资源。
*category是我们实际开发中经常用到的,把category打成静态库是没有问题,但是在用这个静态库的工程中,调用category中的方法时会出现找不到该方法的运行时错误,解决办法是:在使用静态库的工程中配置other linker flags的值为-Objc。
*如果一个静态库很复杂,需要暴露的.h比较多,就可以在静态库的内部新建一个.h文件(一般这个.h文件的文件名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以。
封装framework步骤:
1、打卡xcode新建工程,选择Framework&Library --> Framework,然后点next
标题
2、创建功能类或者拖入已有的功能类
标题3、实现功能类的功能
.h 文件中
@interface ShowResult : NSObject
+ (void)show;
@end
.m文件中
#import "ShowResult.h"
@implementation ShowResult
+ (void)show
{
NSLog(@"hello world !!!");
}
@end
4、更改xcode项目配置
在TARGETS下选中工程>Build Setting>搜索linking,然后几个需要设置的选项都显现出来。
a、首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。
b、然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接
c、最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。
5、增加armv7s
标题
6、设置headers
将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,当然,隐藏的头文件就无法再被引用。
标题然后需要在FrameworkTest.h(必须是公开的,否则无法引用)中将你所有要公开的.h引入。
标题7、打包
打包方式有两种,一种是手动打包,另一种是脚本打包,这里我们用手动打包。
a/ 选中模拟器,编译程序command + B
b/ 选中测试机,编译程序command + B
c/ 在finder中找到framework文件
标题一个是Debug-iphoneos(真机)下的,一个是Debug-iphonesimulator(模拟器)下的。
8、通过终端命令将两个framework合为一个模拟器和真机都可使用的framework。
标题打开终端,输入
使用命令行 lipo -info 查看framework架构信息 真机版本。
如上图1区;
模拟器版本。
如上图2区;
合并真机模拟器版本 因为以上获取的framework只能在对应的版本上运行(即真机只能在设备上运行模拟器版本只能在模拟器上面运行使用)所以需要合并为通用版本 命令行语句:sudo lipo -create (此处请填写真机FrameworkTest文件路径) (此处填写模拟器FrameworkTest文件路径) -output 自定义合成文件存储路径(合成文件的名字FrameworkTest)。
如上图3区;
根据以上命令就在相应位置生成了新的FrameworkTest文件,然后把这个新生成的文件拷贝到相应的framework中进行FrameworkTest文件替换。
查看替换后的framework支持全部真机模拟器架构;
如上图4区;
9、制作好的framework集成使用 把制作好的framework拖入到工程中,引用相关头文件,然后初始化进行暴露方法调用。
标题