最近在做一个小项目,需要给客户一个demo测试,有一部分核心代码暂时不想让客户知道,就想到了打包成framework或.a库。库有两种:

  • 静态库:.a和.framework
  • 动态库:.tbd和.framework

静态库和动态库的区别

  • .a文件肯定是静态库,. tbd肯定是动态库,.framework可能是静态库也可能是动态库
  • 静态库在链接时,会被完整的复制到可执行文件中,如果多个App都使用了同一个静态库,那么每个App都会拷贝一份,缺点是浪费内存。类似于定义一个基本变量,使用该基本变量是是新复制了一份数据,而不是原来定义的;
  • 动态库不会复制,只有一份,程序运行时动态加载到内存中,系统只会加载一次,多个程序共用一份,节约了内存。类似于使用变量的内存地址一样,使用的是同一个变量;
  • 但是项目中如果使用了自己定义的动态库,苹果是不允许上架的,在iOS8.0以后苹果开放了动态加载. tbd的接口,用于挂载. tbd动态库

使用静态库的好处

  • 模块化,分工合作
  • 避免少量改动经常导致大量的重复编译连接
  • 也可以重用,注意不是共享使用

使用动态库的好处

  • 使用动态库,可以将最终可执行文件体积缩小
  • 使用动态库,多个应用程序共享内存中得同一份库文件,节省资源
  • 使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的。

静态库的使用场景

  • 保护自己的核心代码,自己不想别人看到的部分
  • 将MRC的项目打包成静态库,可以在ARC下直接使用,不需要在转换

iOS设备的CPU架构

模拟器

  • 4S-5:i386
  • 5s-7P:x86_64

真机

  • armv6:iPhone – iPhone3G
  • armv7:iPhone 3Gs,4,4S,iPad,iPad2
  • armv7s: iPhone 5、iPhone 5c
  • arm64:iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3

没有armv64

下面言归正传,做点正事

.a静态库

1.创建一个新的工程,选择下面这个模板:

图1.png

完成

图2.png

2.我这里就在Test操作了(亲,你打包.a的时候,可以删除默认文件,拉入自己想加入的任何文件)

图3.png

图4.png

下面在创建一个Person类

图5.png

图6.png

3.选择需要公开的头文件

  • 添加头文件

添加头文件.gif

4.修改配置

  • Build Active Architecture Only 修改为NO,否则生成的静态库就只支持当前选择设备的架构。

图7.png

  • iOS Deployment Target ,静态库需要支持版本

图8.png

  • ach-O Type 更改成 Static Library ,.a默认就是 Static Library ,这一步可以省略

图9.png

5.编译

选择 Generic iOS Device任意一个模拟器 各编译一次,完成后,在工程的 Products 文件夹下的.a文件从红色编程了黑色。编译成功,然后 Show in Finder

编译.gif

可以看到真机与模拟器都生成了.a。里面都有有我选择公开的头文件

这个时候,可以用命令 lipo -info 静态库名字 来看下,支持的iOS的CPU框架

支持架构.gif

  • Debug-iphoneos 里面支持armv7、arm64,属于真机,用到模拟器就会报错
  • Debug-iphonesimulator 里面支持i386、x86_64,属于模拟器,用到真机会报错

6.合并静态库-让模拟器和真机使用一个静态库

命令如下:

lipo -create第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径

合成静态库.gif

这个生成的 libTest.a ,就是支持真机和模拟器的静态库了。创建一个文件夹,把.a和头文件拖进去,这个文件夹就是我们所需要的。

完成.gif

为了开发方便,我们可以使用生成的通用静态库,但是上线的时候只导入真机的,这样工程的体积也会小一些。

使用.a静态库

新建一个工程,把我们的静态库拖进去,导入头文件。

图10.png

.framework静态库

1.Xcode创建一个新工程,需要选择这个 Cocoa Touch Framework 这个模板

  • 创建完成后的 framework.hInfn.plist 不要删除(创建framework的时候命名不要用framework命名,否则在使用这个framework的时候会报错)

图11.png

2.创建Person,也是输入名字和年龄,和.a一样

图12.png

图13.png

注意事项:

  • 如果打包的文件中有设置图片的地方,如果还是通过 [UIImage imageNamed:] 的方式设置,图片可能不会显示。
  • 图片最好单独打包一个 bundle ,这个时候设置图片的方式为:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
//拿到路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"bundle" ofType:@"bundle"];
//设置图片
UIImage *image = [UIImage imageNamed:@"delete" inBundle:[NSBundle bundleWithPath:path] compatibleWithTraitCollection:nil]; [button setImage:image forState:UIControlStateNormal];

3.选择要公开的头文件

这里主要是让使用者知道有哪些方法和头文件可以使用

  • 第一种添加头文件的方式,把需要公开的头文件添加到public里面

图14.png

  • 第二种添加头文件的方式。在右侧的选择中,选择Public

第二种方式添加头文件.gif

注意。要在这个文件中引入需要公开的头文件

图15.png

这里有一个注意点,公开的头文件中,#import的其他类也要公开,添加到public中,如果不想公开,就在头文件用用@class的方式,在对应的.m中用#import方式

4.修改配置

  • Build Active Architecture Only

    Build Active Architecture Only 修改为NO,否则生成的静态库就只支持当前选择设备的架构。

    图16.png

  • Mach-O 格式,因为动态库也可以是以framework形式存在,所以需要设置,否则默认打出来的是动态库。

    静态库 Static Library (默认为 Dynamic Library

图17.png

  • 支持版本

图18.png

5.编译

选择 Generic iOS Device任意一个模拟器 各编译一次,完成后,在工程的 Products 文件夹下的.a文件从红色编程了黑色。编译成功,然后 Show in Finder

生成framework.gif

可以看到真机与模拟器都生成了.framework。里面都有我们选择公开的头文件

这个时候,可以用命令 lipo -info framework静态库文件下二进制文件的名字 来看下,支持的iOS的CPU框架

支持框架.gif

  • Debug-iphoneos 里面支持armv7、arm64,属于真机,用到模拟器就会报错
  • Debug-iphonesimulator 里面支持i386、x86_64,属于模拟器,用到真机会报错

6.合并静态库-让模拟器和真机使用一个静态库

命令如下:

lipo -create第一个framework文件下二进制文件的绝对路径 第二个framework文件下二进制文件的绝对路径 -output 最终的二进制文件路径

新的framework.gif

将合成的二进制文件拖进任何一个framework,替换掉原来的,然后把这个新的framework拖进项目就可以使用了

使用framework静态库

新建一个工程,把我们的静态库拖进去,导入头文件。然后调用Person中的方法。

图19.png

如果静态库中有Category类,就要在使用静态库项目的配置中添加 -ObjC 或者 -all_load
如果创建的framework类中使用了.tbd,则项目中也要导入.tbd动态库

注释:部分名词摘自网络。虽然说,学到的都是我们的,但是也不要忘记他人。

iOS中,Framework和.a的打包及使用的更多相关文章

  1. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用

    iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用 前言 开发中经常使用三方库去实现某特定功能,而这些三方库通常又分为开源库和闭源库.开源库可以直接拿到源码,和自 ...

  2. iOS在framework中使用CoreData出现崩溃问题及解决方法

    公司项目中有一个功能,保存授权令牌数据.最开始只有一条数据,所以就直接保存在了userdefaults中.后来需要两条数据,还是保存在userdefaults中,其中一条为固定的,另一条不固定可以进行 ...

  3. iOS中JS 与OC的交互(JavaScriptCore.framework)

    iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...

  4. ionic在iOS中打包失败

    在ios中打包失败,遇上这样的错误 解决办法,查看index.html的权限是否是只读状态,如果是,改成可读可写,再次打包重试,成功!

  5. iOS中的主要框架framework

    在日常的iOS项目开发中,主要使用的就是Foundation和UIKit这两个框架. (一)Foundation框架 Foundation是对Core Foundation框架的一个封装,使用Foun ...

  6. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  7. iOS中集成ijkplayer视频直播框架

    ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...

  8. iOS中崩溃调试的使用和技巧总结 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Cras ...

  9. 添加极光推送以及在ios中的问题

    项目为 ionic1 + angular1 1.添加极光推送插件 用cordova进行添加 cordova plugin add jpush-phonegap-plugin --variable AP ...

随机推荐

  1. @tap的传参和对全局变量的修改 onTap方法的k-v参数同时传入;

    小程序wepy <view class="weui-panel__bd" @tap="onTap(e)" data-tapkey="itemNa ...

  2. VMware Workstation 虚拟机纯 Linux 终端如何安装 VMware Tools ?

    VMware Workstation 虚拟机纯 Linux 终端如何安装 VMware Tools ? 1.首先在虚拟机设置里面设置一个共享文件夹 2.在虚拟机菜单栏中选择 VMware Tools ...

  3. 解决john不能开多个进程的问题

    在使用john进行shadow文件破解时,如果已经开了一个john的进程,这回提示以下错误: Crash recovery file is locked: /root/.john/john.rec   ...

  4. 怎样使用Chrome模拟手机浏览器測试移动端网站

    作者:zhanhailiang 日期:2014-10-10 环境说明: Chrome 37.0.2062.124 m 1. 通过[菜单→工具→开发人员工具|Javascript控制台]或[快捷键Ctr ...

  5. discuz论坛用户资料采集器

    discuz论坛用户资料采集器, 自动采集用户信息!

  6. Oracle学习笔记—归档模式

    什么是归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做 ...

  7. (扫盲)C#中out和ref之间的区别

    首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...

  8. 解释python中join()和split()函数

    join能让我们将指定字符添加至字符串中 a=') print(a) print(type(a)) #1,2,3,4,5,6 #<class 'str'> split()能让我们用指定字符 ...

  9. ionic项目注意点

    1.controller 名字一定要大写 config如过传递controller,则要使用controllerAs ,开头使用小写 2.在scss中新添加scss文件,要重启

  10. Boostrap常用组件英文名

    dropdownlisttabsearchVertical TabSidebar with tabssidebarExpandable Panel ListFiltered Attendees Lis ...