iOS中Framework和.a的打包及使用

原文
iOS中,Framework和.a的打包及使用

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

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

静态库和动态库的区别

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

总结:
静态库:
1.编译时将程序放进进可执行程序
2.会产生多分副本
3.不依赖程序运行
动态库:
1.程序运行时,加载时才去动态库找函数
2.多进程共享
3.依赖程序运行

使用静态库的好处

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

使用动态库的好处

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

静态库的使用场景

  • 保护自己的核心代码,自己不想别人看到的部分
  • 将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 <静态库只要支持了armv7,就可以在armv7s的架构上运行>
  • arm64:iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3

没有armv64

下面言归正传,做点正事

.a静态库

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

a1.jpeg

完成

a2.jpeg

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

a3.jpeg
a4.jpeg

下面在创建一个Person类

a5.jpeg
a6.jpeg

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

  • 添加头文件
a7.gif

4.修改配置

  • Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。
a8.jpeg
  • iOS Deployment Target ,静态库需要支持版本
a9.jpeg
  • Mach-O Type更改成Static Library,.a默认就是Static Library,这一步可以省略
a10.jpeg

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

a11.gif

可以看到真机与模拟器都生成了.a。里面都有有我选择公开的头文件
这个时候,可以用命令lipo -info 静态库名字来看下,支持的iOS的CPU框架

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

6.合并静态库-让模拟器和真机使用一个静态库
命令如下:
lipo -create第一个.a文件的绝对路径 第二个.a文件的绝对路径 -output 最终的.a文件路径

a13.gif

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

a14.gif

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

使用.a静态库

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

a15.jpeg

.framework静态库

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

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

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

framework2.jpeg
framework3.jpeg
注意事项:
  • 如果打包的文件中有设置图片的地方,如果还是通过[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里面
framework4.jpeg
  • 第二种添加头文件的方式。在右侧的选择中,选择Public
framework5.gif

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

framework6.jpeg

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

4.修改配置

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

    framework7.jpeg
  • Mach-O Type,因为动态库也可以是以framework形式存在,所以需要设置,否则默认打出来的是动态库。
    静态库Static Library(默认为Dynamic Library

framework8.jpeg
  • iOS Deployment Target ,静态库需要支持版本
framework9.jpeg

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

framework10.gif

可以看到真机与模拟器都生成了.framework。里面都有我们选择公开的头文件
这个时候,可以用命令lipo -info framework静态库文件下二进制文件的名字来看下,支持的iOS的CPU框架

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

6.合并静态库-让模拟器和真机使用一个静态库
命令如下:
lipo -create第一个framework文件下二进制文件的绝对路径 第二个framework文件下二进制文件的绝对路径 -output 最终的二进制文件路径

framework12.gif

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

使用framework静态库

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

framework13.jpeg

如果静态库中有Category类,就要在使用静态库项目的配置中找到主工程的 target --Build Setting--Linking--更改其 Other Linker Flags为:-ObjC-all_load 即可。
如果创建的framework类中使用了.tbd,则项目中也要导入.tbd动态库

参考文章:
iOS中,Framework和.a的打包及使用
静态库与动态库的区别以及framework的使用
C语言静态库与动态库的区别的深入分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 最近在做一个小项目,需要给客户一个demo测试,有一部分核心代码暂时不想让客户知道,就想到了打包成framewor...
    carpond阅读 13,431评论 19 62
  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 11,882评论 3 42
  • 从七月开始恢复每周的阅读,选择精力管理也是合适的开始。总觉得自己时间不够用,拖延症又日渐严重,看过一些时间管理的书...
    铃兰小语阅读 730评论 2 0
  • 忙碌的时候 会忘记表达 最近 由于忙碌 我不再读书 不再写字 只是专注的忙碌 忙碌些应该忙碌的事情 ...
    陈列达杰阅读 236评论 0 0
  • 这本书估计还剩不到100页了,今天下班回去就可以看完,这个系列明天再写一篇就结束了。 昨天下班就去踢球,从7点30...
    闻舒阅读 279评论 0 0