IOS 静态库.a 和.framework

1.静态库的简介

什么是库?

  • 库是程序代码的集合,是共享程序代码的一种方式

  • 根据源代码的公开情况,库可以分为2种类型

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

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

静态库和动态库

  • 静态库和动态库的存在形式
    静态库:.a 和 .framework
    动态库:.dylib 和 .framework

  • 静态库和动态库在使用上的区别
    静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(下图所示)


    静态库

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


动态库
  • 需要注意的是:
    项目中如果使用了自制的动态库,不能被上传到AppStore

静态库应用的场景

保护自己的核心代码
国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用
例如:百度地图,友盟,JPush等
将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换

1.静态库的特点

.a + .h
看不到具体实现的代码

2.静态库的制作

  1. 创建项目时, 直接选择静态库(.a)
  2. 设置需要暴漏的头文件 TARGETS->Build Phases->Copy Files->把需要暴露的头文件添加进来即可


    暴露头文件
  3. 在模拟器环境下编译(得到模拟器环境下的静态库)
  4. 在真机环境下编译(得到真机环境下的静态库)

3. 静态库使用测试

  • 使用模拟器的静态库, 拖入测试工程
    使用6S模拟器进行测试, 通过
    使用真机, 编译; 失败
    使用低型号模拟器测试,; 失败
  • 测试结果分析

模拟器下的静态库和真机下的静态库不能共用
主要原因是模拟器和真机CPU架构不一样(各个模拟器型号之间架构也不一样)

  • 注意静态库所支持的架构,不同机型的CPU, 对应的架构不同;

模拟器:
4s----5 : i386
5s----6sPlus : x86_64

真机:
3gs---4s : armv7
5/5c : armv7s(armv7兼容armv7s)
5s---6sPlus: arm64

  • 查看静态库支持的架构 lipo -info 库文件
    分别选中不同的模拟器, 进行编译, 查看不同的静态库支持架构
  • 怎样一次编译支持多个架构的的静态库?
    • 问题描述:
      正常情况下, 需要选中每一个模拟器进行编译, 生成支持对应架构的静态库. 然后合并; 非常蛋疼
    • 解决方案:
      Build Settings -> Build Active -> NO


      生成都能用的静态库

4 静态库文件的版本

调试版本

1.真机-Debug版本
2.模拟器-Debug版本

  • 特点
    • 调试版本会包含完整的符号信息,以方便调试
    • 调试版本不会对代码进行优化

发布版本

  1. 真机-Release版本
  2. 模拟器-Release版本
  • 特点
    • 发布版本不会包含完整的符号信息
    • 发布版本的执行代码是进行过优化的
    • 发布版本的大小会比调试版本的略小
    • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升

怎样生成不同版本?

项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译


生成不同的版本

如果想要一个静态库, 既可以在模拟器上运行, 也可以在真机上运行怎么做?

  • 因为静态库针对于模拟器和真机生成了不同版本(支持不同架构), 所以没法同时运行
  • 解决方案: 静态库的合并
    检测.a的类型 $ lipo -info libCZTools.a
    合并
    lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

lipo -create 静态库1 静态库2 - outpuy 静态库名字
特点:
合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
今后在使用.a时一定注意版本

5. 静态库制作(.framework)

  1. 新建功能, 直接选择.framework静态库


    选择
  2. 编译时, 设置编译所有架构


    选择编译
  3. 默认制作的是动态库, 需要设置链接类型target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库

    设为静态

编译的时候需要把我自己生成功的工具类的头文件移动到Headers的 public里面


默认

修改后

静态库打包的完整正确步骤!!

    1. 确定是静态库

.a 的肯定是静态库
.framework的需要设置链接类型 target -> Build Settings-> 搜索 Mach-o Type ; 改为静态库

    1. 确定支持模拟器或者真机中的所有架构

Build Settings -> Build Active -> NO
表示不止编译活跃的架构, 让所有的架构都编译

    1. 提供的静态库应该是release版本

项目 -> Edit Scheme -> Run -> Release/Debug 分别进行编译

.a静态库和.framework静态库的区别?

  • 1> .a是一个纯二进制文件, .framework中除了有二进制文件之外还有资源文件
    2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
    3> .a + .h + sourceFile = .framework
    4> 建议使用.framework

2. 静态库开发中的常见问题

  • 问题1: 有些第三方库会使用到一些图片素材,例如公司的logo等。
    由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,可能与使用静态库的程序冲突。

解决方案
在静态库中如果要使用图片素材,会利用bundle的手段
1> 建立bundle,并且向其中添加图片
2> 创建一个类方法,返回图片
3> 编译
4> 调用方如果需要使用,需要导入 .h + .a + XXX.bundle

  • 问题2:如果用户需要导入的头文件过多怎么加?
    建议使用一个主头文件包含其他头文件, 让用户只导入一个主头文件

  • 问题3: 静态库程序怎样测试?
    静态库本身就是一个小项目, 实现某些功能, 但是这些功能在开发中也需要测试. 而测试代码又不能作为静态库的一部分
    创建复合项目
    选择target 下面的+ 号,创建一个静态库项目

创建一个可以测试的静态库

将MRC的项目,打包成静态库, 可以在ARC下直接使用, 不需要转换

MRC环境

swift打包动态库

1 . 选择项目的时候用framework,创建语言使用swift。设置适当的版本
swift文件不是头文件,我们需要把它暴露出去。应该在class前面添加public

import UIKit

public class LogTool : NSObject
{
  public func logName()
    {
        print("动态的swift库测试")
    }
}

然后在进行编译

使用,

找到库文件 拖入我们的项目,在使用的地方倒入头文件


import UIKit
import swiftWork

class ViewController: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading th
        LogTool().logName()
    }


}

如果出现,image not found的错误 ,需要在targets里面设置Embedded

设置为Embedded

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356