zoukankan      html  css  js  c++  java
  • 静态库.a文件和.framework文件

    静态库.a文件和.framework文件

    一、简介

    什么是库:库是程序代码的集合,是共享程序代码的一种方式。

    根据源代码公开情况,库可以分为两种:开源库和闭源库

    开源库

           公开源代码,能看到具体实现。如:SDWebImage、AFNetworking

    闭源库

           不公开源代码,是经过编译后的二进制文件,看不到具体实现

           闭源库主要分为:静态库和动态库

    二、静态库和动态库

    静态库和动态库的存在形式

    静态库:.a和.framework

    动态库:.dylib和.framework

    静态库和动态库在使用上的区别

           静态库:连接时,静态库会被完整的复制到可执行文件中,被多次使用就有多份冗余拷贝

                 

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

                 

    注意:项目中使用了自制的动态库,不能被上传到AppStore

    三、制作.a文件

    1、选择“Cocoa Touch Static Library”

     

    2、输入静态库名称

     

    3、添加库需要包含的源代码

     

    4、选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中

     

    5、选择真机设备,然后 Command+B 编译,libMJRefresh.a文件从红色变为黑色

    选择模拟器,依然 Command+B ,模拟器和真机环境下用的.a文件是分开的

     

    6、右击“Show In Finder”,查看制作好的.a文件

    Debug-iphoneos文件夹里面的东西是用在真机上的

    Debug-iphonesimulator文件夹里面的东西是用在模拟器上的

    如果Scheme是Release模式,生成的文件夹就以Release开头

    7、合并.a文件

    1)如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并。

    在终端输入指令:

    lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

    ü  蓝色部分是固定指令

    ü  红色、紫色是真机和模拟器.a文件的路径

    ü  绿色是所合成.a文件的路径

    2).a文件的体积(一般情况下)

    真机用的.a > 模拟器用的.a

    所合成.a == 真机用的.a + 模拟器用的.a

    3)通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)

    4)使用.a文件:

    直接将.a、.h、资源文件拖拽到其他项目中即可

     

    四、手工制作.framework文件

    1、选择“OS X”-“Framework & Library”-“Bundle”

     

    2、输入静态库名称

     

    3、修改配置

    1)刚才是基于OS X创建的工程,所以得修改项目环境为iOS的

     

    修改Linking

     

    2)修改Packaging

     

    3)修改Info.plist

     

    4)注释掉pch文件的内容

     

    5)添加库需要包含的源代码

     

    6)添加需要暴露出来的 .h 文件

     

     

    7)添加需要暴露出来的 .h 文件,并且放到Public下面

     

    4、生成.framework文件

    跟 .a 是一样的,分别选择真机和模拟器,Command+B

    真机和模拟器下的 .framework 也是分开使用的

    生成的framework在Xcode的缓存文件夹中

    /Users/用户名/Library/Developer/Xcode/DerivedData/项目名/Products

    5、合并.framework文件

    可以在终端下使用lipo指令合并 .framework, 需要合并的是framework里面的某个文件

     

    直接拖拽整个 .framework 到其他项目的Frameworks文件夹下

    然后包含主头文件:#import <MJRefresh/MJRefresh.h>

     

    五、模板制作.framework

    手工制作 .framework 过于复杂,借助开源模板进行制作会比较简单

    模板地址https://github.com/kstenerud/iOS-Universal-Framework

    1、安装模板

    在终端下进入iOS-Universal-Framework/Fake Framework文件夹

    执行指令./install.sh

    安装模板后,完全重启Xcode

     

    2、最后将 .framework 的结构调整一下即可

     

    六、制作静态库的注意点

    1、无论是.a静态库还是.framework静态库,最终需要的都是:

           二进制文件+.h+其他资源文件

    2、.a和.framework的使用区别

           .a本身是一个二进制文件,需要配上.h和其他资源文件才能使用

           .framework本身已经包含了.h和其他资源文件,可以直接使用

    3、图片资源处理

    如果静态库中用到了图片资源,一般放到一个bundle文件中,bundle名字一般跟.a或者.framework名字一致

    Bundle的创建:新建一个文件夹,扩展名改为.bundle即可,邮寄bundle文件,显示包内容,就可以往包里放东西

    4、多文件处理

    如果静态库要暴露出来的.h文件比较多,可以考虑创建一个主头文件(主头文件一般和静态库同名)

    在主头文件中包含所有其他需要暴露出来的.h文件,在使用静态库的时候只需要:#import<主头文件名>

    5、.framework为什么既是静态库又是动态库

    系统的.framework是动态库

    我们自己创建的.framework是静态库

    6、静态库中包含了Category

    如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance)

    解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC

     

  • 相关阅读:
    faster with MyISAM tables than with InnoDB or NDB tables
    w-BIG TABLE 1-toSMALLtable @-toMEMORY
    Indexing and Hashing
    MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size
    controlling the variance of request response times and not just worrying about maximizing queries per second
    Variance
    Population Mean
    12.162s 1805.867s
    situations where MyISAM will be faster than InnoDB
    1920.154s 0.309s 30817
  • 原文地址:https://www.cnblogs.com/somebodywx/p/5340709.html
Copyright © 2011-2022 走看看