美文网首页
Xcode 封装生成静态库

Xcode 封装生成静态库

作者: Y_Eric | 来源:发表于2018-05-04 15:00 被阅读0次

鉴于开发便利及程序共享性,我们需要对自己的项目封装成库,方便别人使用,下面就介绍一下库的基本知识。

一、什么是库?

1、库是共享程序代码的方式,一般分为静态库和动态库。

2、静态库形式:.a和.framework。

3、动态库形式:.dylib和.framework。

4、系统的.framework是动态库,我们自己建立的.framework是静态库。

二、静态库与动态库的区别?

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝造成内存资源浪费。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

三、a与.framework有什么区别?

1、.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

2、.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

3、也就是说如下对等

      .a + .h + sourceFile = .framework。

故对比建议用.framework。

四、为什么要使用静态库?

1 方便共享代码,便于合理使用。

2 实现iOS程序的模块化,可以把固定的业务模块化成静态库。

3 和别人分享你的代码库,但不想让别人看到你代码的实现。

4 开发第三方sdk的需要。

五、制作静态库时的几点注意:

1、 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h和其它文件,可以直接使用。

2、 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源,使用图片时需要指明 bundle: [UIImage imageNamed:@"xxx.bundle/xxx.png"]。也可以用 Target 方式制作 bundle,使用时和.framework一起拖入工程即可。

3、category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中 为other linker flags添加两个参数 -ObjC -all_load。

4、 如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),把所有需要暴露出来的.h文件都集中放在这个.h文件中后各自隐藏,然后仅将内部创建的这个.h公开即可。

封装a

1、创建Atest工程,选择Cocoa  Touch  Static Library,然后next。

2、创建功能类或者直接将现有类刚刚创建的Atest项目中

3、设置Headers,将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,需要注意的是隐藏的头文件将无法被引用。

步骤23操作

4、分别在真机和模拟器预编译Atest工程(command+b),然后选择libAtest.a-> show in Finder ,将Debug-iphoneos->libAtest.a与Debug-iphonesimulator->libAtest.a 终端命令合并(lipo-create+空格+真机下的libAtest.a+空格+模拟器下的libAtest.a+空格+-output+空格+存放路径)。

show in Finder .a合并

5、将合并后libAtest.a+TestObj.h导入到工程中,调用暴露方法即可。

用法

封装framework

一、创建工程,选择Cocoa  Touch  Framework,然后next。

创建工程

二、更改xcode配置

在TARGETS下选中工程>Build Setting>搜索

1、将Dead Code Stripping 设置为NO,开启此项会对代码中的”dead”、”unreachable”的代码过滤,为了完整还原framework中的代码,建议关闭。

2、将Link With Standard Libraries 设置为NO,避免重复链接。

3、将Mach-O Type设为Static Library(用户制作的framework只能是静态库)。

配置123

4、选择Architectures配置arm64、armv7、armv7s兼容设备。

兼容设备

备注:(简单介绍一下arm)

arm结构处理器,几乎所有的手机都基于arm,其在嵌入式系统中应用非常广泛。

ARM 处理器因为低功耗和小尺寸而闻名,它的性能在同等功耗的产品中也很出色。这里我们注意一点,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。只有在目标设备上,才会执行设备对应的指令集。

ARMv6设备包括

iPhone, iPhone2, iPhone3G以及第一代和第二代iPod Touc

ARMv7设备包括

iPhone3GS, iPhone4iPad, iPad2, the new ipadiPod touch 3G, iPod touch

ARMv7s设备包括iPhone5,iPhone5S及以上

如果在工程build setting的Architectures中 选“Standard Active Architecture Only”为True则,选择Armv6或v7都只会编译对应指令集的包;若选false,则编译器会整合两个指令集到一起,则包比较大,但是能使用Armv7 的优化,同时能适配到老的机器。一般Debug的时候“Build Active Architecture Only”选择YES,用当前架构看代码逻辑是否有问题,发Release的时候选择NO,因为需要适配其他的机型。低arm的包可以在高arm的机子上跑,反之则不可以。

三、功能类导入

创建功能类或者直接将现有类刚刚创建的项目中,

拖入现成功能类 待封装的功能类

四、功能类实现代码(随意写,只为测试。)

TestObj.h

/**

计算返回值

*/

+ (TestObj *)returnVaule;

TestObj.m

+ (TestObj *)returnVaule {
    static TestObj *obj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        obj = [[self alloc] init];
    });
    return obj;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSInteger a = 10;
        NSInteger b = 20;
        NSLog(@"+++++++%ld++++++",a+b);
    }
    return self;
}

五、设置Headers,将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,需要注意的是隐藏的头文件将无法被引用。

Headers配置

六、打包封装

1、分别在真机和模拟器预编译Cocoa  Touch Framework 工程(command+b)。

2、选择testFramework.framework -> show in Finder ,将 Debug-iphoneos->testFramework.framework->testFramework 与Debug-iphonesimulator->testFramework.framework->testFramework终端命令合并(lipo -create+空格+真机下的testFramework+空格+模拟器下的testFramework+空格+-output+空格+存放路径)

终端命令

3、经步骤2的操作会在ee同目录文件下生成ee.lipo文件,将ee.lipo更名为testFramework后替换Debug-iphoneos->testFramework.framework->testFramework而此时Debug-iphoneos目录下的testFramework.framework即是我们最终所需的静态库。

点击桌面qqq文件夹会看到刚刚合并生成的ee.lipo文件

七、库的使用

将testFramework.framework导入到工程中,调用暴露方法即可。

静态库的使用 打印输出

相关文章

网友评论

      本文标题:Xcode 封装生成静态库

      本文链接:https://www.haomeiwen.com/subject/dqtdrftx.html