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. nohup程序后台执行

    Linux常用命令,用于不挂断的执行程序. nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应 ...

  2. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  3. 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo

    Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...

  4. 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)

    Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...

  5. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 【Reading Note】算法读书杂记

    1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...

  7. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  8. 云计算下PAAS的解析一

    云计算下PAAS的解析一       PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...

  9. React Native Android gradle下载慢问题解决

    很多人会遇到 初次运行 react-native run android的时候 gradle下载极慢,甚至会失败的问题 如下图 实际上这个问题好解决的 首先 把对应版本的gradle下载到本地任意一个 ...

  10. Android程序中--不能改变的事情

    有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...