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 ...
随机推荐
- nohup程序后台执行
Linux常用命令,用于不挂断的执行程序. nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应 ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo
Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...
- 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)
Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...
- [C#] 简单的 Helper 封装 -- RegularExpressionHelper
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【Reading Note】算法读书杂记
1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...
- 使用RequireJS并实现一个自己的模块加载器 (一)
RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...
- 云计算下PAAS的解析一
云计算下PAAS的解析一 PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...
- React Native Android gradle下载慢问题解决
很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...
- Android程序中--不能改变的事情
有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...