美文网首页
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