• 静态库的制作


    概念

    库是程序代码的集合,是共享程序代码的一种方式
    根据源代码的公开情况,库可以分为2种类型

    开源库

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

    闭源库

    不公开源代码,是经过编译后的二进制文件,看不到具体实现
    主要分为:静态库、动态库
    静态库:.a 和 .framework
    动态库:.dylib 和 .framework

    静态库和动态库在使用上的区别
    静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
    动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(右图所示)

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

    制作.a静态库

    1.Xcode ->Framework&Library(iOS) -> Coca Touch Static Library

    2.添加需要制作的.m文件

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

    4.选择模拟器或真机 打包

      模拟器(X86_64)和真机(armv7,arm64...)打包出来的.a文件支持不同的CPU架构

      用 lipo –info libXXX.a 可以查看 .a 支持的CPU类型

      可以合并模拟器和真机的.a文件使之同时支持模拟器和真机上运行

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

    (PS:若.a有自己的资源文件,一般制作成Bundle 最终交付的为:.a + .h + Bundle

         合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的今后在使用.a时一定注意版本

    制作.framework

    》 Xcode6 之前没有模板制作framework,必须自己手工制作,很是繁琐。

    可以借助github上的开源模板制作 https://github.com/kstenerud/iOS-Universal-Framework
      (在终端下进入iOS-Universal-Framework/Fake Framework文件夹,执行指令./install.sh安装模板)

    》Xcode6后,可以直接用Xcode提供的模板

    Xcode ->Framework&Library(iOS) -> Coca Touch Dynamic Library

    (PS: 系统模板生成的framework是动态库,appstore是不允许有自制的动态framework的,因此需要修改成静态framework

        选中framework在Build Setting->Linking->Mack-O Type 中选择Static Library即可转为静态framework

    制作静态注意点

    0).a和.framework区别

    .a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
    .framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

    (图片资源的处理
      如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致
      bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西

    1)多文件处理
    如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)
    在主头文件中包含所有其他需要暴露出来的 .h 文件
    使用静态库时,只需要#import 主头文件(实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>)

    2)静态库中包含了Category
    如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance
    解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC

  • 相关阅读:
    解决 ThinkPHP5 RCE 在PHP7下,不能使用包含的问题
    文件上传 之 条件竞争
    ThinkPHP3.2.4 order方法注入
    Mysql 不能使用逗号的情况
    MSSQL 注入笔记
    ThinkPHP 5.0.15中的update注入漏洞
    Thinkphp5 由Request导致的RCE漏洞版本小结
    即学即用,轻松搞定这些选择器!(上)
    JavaScript的使用你知道几种?(上)
    前端修炼の道 | <div> 标签简介
  • 原文地址:https://www.cnblogs.com/shanhua/p/4771974.html
Copyright © 2020-2023  润新知