iOS开发中静态库之".framework静态库"的制作及使用篇
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:
- 在ViewController.m文件中导入静态库的主头文件
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静态库"的制作及使用篇的更多相关文章
- 如何在IOS开发中在自己的framework中添加.bunble文件
今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...
- 汇总iOS开发中需要用到的开源库
来源:http://mobile.51cto.com/hot-431256.htm 1.iOS &iPhone 网络异步加载 asi-http-request [1-1 ASI HTTP 下载 ...
- iOS开发中使用静态库 .a 文件
iOS开发中,在使用一些第三方库时,可能是一个静态库(比如GPUImage).这种情况下,需要编译出静态库文件(.a) ,然后配合响应的头文件(.h 文件)使用. 编译静态库,直接在Xcode中编 ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- iOS:Xcode7下创建 .a静态库 和 .framework静态库
Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...
- 在iOS开发中,给项目添加新的.framework
首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...
- iOS开发中与库相关的术语
动态库 VS 静态库 Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
随机推荐
- Npm包的开发
个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │ ...
- 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- C++中的引用
一,C++中引用的基础知识 1.引用的基本概念 1.所谓的引用其实就是对变量起“别名”.引用和变量对应得是相同的内存,修改引用的值,变量的值也会改变,和指针类似. 2.引用在定义的时候必须要初始化,初 ...
- jquery.Callbacks的实现
前言 本人是一个热爱前端的菜鸟,一直喜欢学习js原生,对于jq这种js库,比较喜欢理解他的实现,虽然自己能力有限,水平很低,但是勉勉强强也算是能够懂一点吧,对于jq源码解读系列,博客园里有很多,推荐大 ...
- dubbox微服务实例及引发的“血案”
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...
- 小兔Java教程 - 三分钟学会Java文件上传
今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...
- EF上下文对象线程内唯一性与优化
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...
- MediatorPattern(中介者模式)
/** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Vue.js——60分钟组件快速入门(上篇)
组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HTML ...