iOS开发中静态库之".framework静态库"的制作及使用篇

  • .framework静态库支持OC和swift

.a静态库如何制作可参照上一篇: iOS开发中静态库之".a静态库"的制作及使用篇

一.OC创建.framework静态库

1.创建工程,语言选择OC

2.进入工程后,会自动帮我们创建一个.h文件,主头文件,和我们项目名称一般完全一致.不要删除了!

3.编写核心代码

  • 依旧使用简单示例,MathTools

MathTools.h文件

@interface MathTools : NSObject

+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;

@end

MathTools.m文件

@implementation MathTools

+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2
{
return num1 + num2;
} @end

4.制作.framework静态库

  • cmd + B 编译一下
  • 我们就会发现在Products文件下面有个实体的.framework文件
  • 右键Show In Finder
  • 发现文件夹内有个.h头文件,但它是主头文件,并不是我们想暴露出去的头文件,我们想暴露的头文件是MathTools.h
  • 来到项目配置,把MathTools.h文件暴露出去

  • 把MathTools.h拖到Public之后,cmd + B编译一下
  • Show In Finder,发现Headers文件夹内有两个.h文件了,我们要暴露的.h文件也在内
  • 大家可能还会发现一个exec的文件,它其实就是我们的.m文件被编译之后的二进制文件

5.测试.framework静态库,先使用OC创建测试工程

  • 将我们制作好的.framework静态库拖入测试的工程项目中

  • 假如我们用OC创建的测试工程

  • 在ViewController中执行touchBegan方法,点击控制器获取结果

    • 在ViewController.m文件中导入静态库的主头文件 #import <MTYMathToolsOC/MTYMathToolsOC.h>
    • 但是我们这时在方法里是拿不到我们静态库中的方法实现的,因为我们并没有在上面的主头文件中导入MathTools.h头文件.
    • 导入MathTools.h头文件,执行touchBegan方法,cmd + R运行程序

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
    NSLog(@"%ld",[MathTools sumNum1:30 num2:40]);
    }
    • 发现程序崩溃了
    // 动态库不能被加载
    dyld: Library not loaded:

5.1.Bug1解决 - dyld: Library not loaded:

  • 我们默认情况下编译出来的.framework库是一个动态库
  • 点击工程 -> General 我们发现,系统在我们编译时默认给我们添加了一个库,在Linked Frameworks and Libraries位置
  • 但是动态库不是在这里添加,在上面的Embedded Binaries处添加

  • 这时在下面仍旧会为我们默认添加这个库,但是这回不要把它删了,运行
  • 这时我们的静态库就可以被使用了

5.2.虽然上面.framework静态库可以被使用,但是它是个动态库,一般开发中我们用的都是静态库

5.3.如何将我们编译.framework改成静态库?

  • 点击工程 -> BuildSetting -> 搜索mach -> 改成Static Library

  • 配置好后,重新编译一下,然后将新的.framework文件拖入测试工程内,编译(别忘了在静态库的主头文件内导入MathTools.h文件)

5.4.但是仍旧存在一个CPU架构支持的问题

  • 这个问题上篇.a静态库中有提及

  • 上面是选择的iPhone 7模拟器,在iPhone 5及真机上仍旧会报错

  • 如何解决?(其实步骤同上篇.a的bug解决步骤几乎一样)

    • 仍旧是终端输入lipo -info来检测
    • 发现支持x86_64
    • 注意: 这里不能直接lipo -info我们的静态库文件,因为它本质和文件夹的作用是一样的,要lipo -info它里面的MTYMathToolsOC这个exec文件.
  • 两种方法解决?

    • 方法1:直接项目配置: 项目 -> Build Setting -> Build Active Architecture Only -> Debug 改为No(上篇文章有配图)
    • 方法2:弄两个.framework文件,终端create合并(同.a文件的操作方法)
  • 但是真机仍旧报错

    • 把.framework静态库选择真机编译一下
    • 终端执行create命令合并成一个MTYMathToolsOC的exec文件,这个文件名必须一致,不能乱写
    • 合并之后查看新的静态库支持的CPU架构
    Architectures in the fat file: MTYMathToolsOC are: i386 x86_64 armv7 arm64
    • 把MTYMathToolsOC文件拷贝到原来的库文件中,替换掉原来的exec文件
    • 就可以使用了

6.使用swift来创建测试工程,看静态库是否可用

  • 创建swift工程
  • 导入我们制作好的静态库文件到项目中
  • 在ViewController.swift中,导入库的头文件,这里我们可以直接敲出来
import MathToolsOC
  • 那么在touchBegan方法中能否敲出方法名呢,试验一下发现并不能.
  • 在swift中,导入库的头文件其实就是导入框架的主头文件MathToolsOC.h,然而我们之前在MathToolsOC.h中并没有把MathTools.h导入其中
  • 所以把MathTools.h导入其中
  • 运行报错,因为我们并没有配置动态库那个步骤

错误信息

// 动态库未加载
dyld: Library not loaded
  • 配置过后就会发现,在swift中测试也没有问题

  • 注意点

1.为什么这次没有把动态库转为静态库?
因为swift中是不支持静态库的,所以转换的话,会报错
2.动态库转静态库的方法见上面

二.用swift来创建.framework库

  • 其实步骤和前面差不多,最初创建时都会遇到这几个问题?

    • .framework默认创建出来是动态库,要在General下面进行配置,在Embeded Binaries添加动态库
    • CPU支持的架构问题.这个同前面方法一样,终端最后合并一下就好
  • 由于步骤相差不大,这里就不再赘述了,但除了上面的bug还有有几个注意点

    • swift中不支持静态库,就是说以前我们创建的.framework库默认是动态库,最后要转为静态库使用,这在OC中可以,但在swift中不可以,如果这里把动态库转为静态库的话,那么就会报错
    • swift创建静态库的时候, 类及类方法前面加上public,以便外界可以调用

iOS开发中静态库之".framework静态库"的制作及使用篇的更多相关文章

  1. 如何在IOS开发中在自己的framework中添加.bunble文件

    今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...

  2. 汇总iOS开发中需要用到的开源库

    来源:http://mobile.51cto.com/hot-431256.htm 1.iOS &iPhone 网络异步加载 asi-http-request [1-1 ASI HTTP 下载 ...

  3. iOS开发中使用静态库 .a 文件

    ​​iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...

  4. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  5. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  6. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  7. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

  8. iOS开发中与库相关的术语

    动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime

  9. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

随机推荐

  1. NiceMark——我的Markdown编辑器

    NiceMark--我的Markdown编辑器 闲来无事,写了一个Markdown编辑器.基于electron,完全采用Web前段技术(Html,css,JavaScript)实现.代码已托管在Git ...

  2. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  3. JavaScript Date对象

    本篇主要介绍 Date 日期和时间对象的操作. 目录 1. 介绍:阐述 Date 对象. 2. 构造函数:介绍 Date 对象的构造函数new Date()几种方式. 3. 实例方法:介绍 Date ...

  4. 在 C# 里使用 F# 的 option 变量

    在使用 C# 与 F# 混合编程的时候(通常是使用 C# 实现 GUI,F#负责数据处理),经常会遇到要判断一个 option 是 None 还是 Some.虽然 Option module 里有 i ...

  5. java中易错点(二)

    java,exe是java虚拟机 javadoc.exe用来制作java文档 jdb.exe是java的调试器 javaprof,exe是剖析工具 解析一: sleep是线程类(Thread)的方法, ...

  6. Function.prototype.toString 的使用技巧

    Function.prototype.toString这个原型方法可以帮助你获得函数的源代码, 比如: function hello ( msg ){ console.log("hello& ...

  7. arcgis api for js入门开发系列八聚合效果(含源代码)

    上一篇实现了demo的图层控制模块,本篇新增聚合效果,截图如下(源代码见文章底部): 聚合效果实现的思路如下: 1.map.html引用聚合包,项目已经包含进来了的聚合文件夹: <script ...

  8. VS2015墙内创建ionic2 【利用nrm更换源,完美!】

    STEP 1 设置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org   一句话建立cnpm STEP 2 安装nr ...

  9. 项目管理_FindBugs的使用

    本章将讲述如何在Myeclipse下,使用FindBugs,静态分析工具,无需开发人员费劲就能找出代码中已有的缺陷. 一:Myeclipse下如何安装FindBugs插件 1:FindBugs插件下载 ...

  10. mysql 大表拆分成csv导出

    最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...