美文网首页iOS项目项目优化组件化
iOS 静态库Framework开发(包含静态库,bundle使

iOS 静态库Framework开发(包含静态库,bundle使

作者: 炎成 | 来源:发表于2019-01-02 13:23 被阅读28次

    静态库和动态库

    静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

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

    静态库:以.a 和 .framework为文件后缀名。
    动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名,系统提供的framework都是动态库。
    

    理解:.a 是一个纯二进制文件,.framework 中除了有二进制文件之外还有资源文件。 .a ,要有 .h 文件以及资源文件配合, .framework 文件可以直接使用。总的来说,.a + .h + sourceFile = .framework。所以创建静态库最好还是用.framework的形式

    静态库和动态库的区别

    静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
    动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;

    共同点:

    静态库和动态库都是闭源库,只能拿来满足某个功能的使用,不会暴露内部具体的代码信息。

    本篇文章主要讲Framework开发的过程和一些细节

    1. 新建工程


      image.png
    2. 修改Mach-O Type 选中Static Library (静态库)


      image.png
    3. 修改构建版本为所有版本,否则只会构建当前选中的设备架构


      image.png
    4. 新建TestView

    @interface YMTestView : UIView
    - (void)changeBackgroundColor:(nonnull UIColor *)bgColor;
    @end
    
    @implementation YMTestView
    - (void)changeBackgroundColor:(nonnull UIColor *)bgColor {
        self.backgroundColor = bgColor;
    }
    @end
    
    1. 将header中需要暴露的头文件由project拖至public


      image.png

      将所有暴露的头文件导入到自动生成的YMSDK.h文件中方便使用。

    2. 设置最低支持版本


      image.png
    3. 编译Framework
      Edit scheme可修改编译Debug版本或者Release版本


      image.png

      编译生成的Framework在Products文件夹中,Show In Finder查看


      image.png
    4. 将编译生成的Framework拖入demo中验证


      image.png

    使用拖拽方式,有一个很大的缺点就是不能进行代码调试,这里推荐一个方法

    image.png

    Add Files to Target, 选择打包Framework项目的.xcodeproj文件 (注意!添加之后需关闭项目,重新打开)


    image.png

    接下来,在demo的build phases中添加对应的Frameworks


    image.png
    如此在运行demo时即可调试Framework项目代码。

    关于bundle

    • 创建bundle工程


      image.png

    修改Base SDK ,默认是MacOS, 改为iOS


    image.png

    修改COMBINE_HIDPI_IMAGES 为NO,否则图片格式为TIFF


    image.png

    接下来添加资源文件,一定要选择copy


    image.png

    编译生成的bundle文件在products文件夹中,show finder查看
    在demo中导入bundle,使用bundle中资源时需要注意,此时的bundle已经不是mainBundle了,需要获取我们创建的bundle,使用图片,Xib和Storyboard都应通过此法获取


    image.png

    快速创建bundle方式

    新建一个文件夹,将需要的资源拖入文件夹,将文件夹重命名为****.bundle,回车确认添加扩展名即可。

    将bundle一起打包进Framework

    将创建好的bundle拖入framework项目中,并添加target

    image.png
    在使用Framework的demo中使用时需要注意,需要添加copy files
    image.png
    image.png
    使用时获取bundle方式
    image.png
    结果验证
    为了方便使用,我们可以将获取Bundle添加宏定义或者添加个分类方法。
    值得注意的是,当我们打包的Framework中有使用其它Framework或.a静态库是,需要将静态库拷贝到项目,但是不需要添加到Target(否则会报重复文件错误),编译通过即可;而使用我们的Framework时,需要手动导入依赖的静态库到Target,否则会报找不到文件错误。

    Framework瘦身方式

    1. release模式下设置Generate Debug Symbols 为NO,debug模式设置为YES,大约可以减少30%的体积。这个指标是为了进行代码调试,如果为NO,debug模式将不能进行断点调试。若想具体了解,点击传送门 https://www.jianshu.com/p/11710e7ab661

      image.png
    2. 删除无用代码,设置Dead Code Stripping为YES,去掉冗余代码即代码被定义但未被使用。

    3. 删除不必的指令集,为了缩小包的体积,可删除armsv7s,因为指令集是向下兼容的,所以设置了armv7是可以在armv7s的设备上运行的,但是执行效率上会有所降低,想详细了解 Architectures,点击跳转 https://www.jianshu.com/p/c76aa6f4a81a

    相关文章

      网友评论

        本文标题:iOS 静态库Framework开发(包含静态库,bundle使

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