夯实基础 砥砺前行 ---iOS静态库的开发

什么是库?

库是共享程序代码的方式,一般分为动态库和静态库。

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

在实际的项目开发中,经常会使用到库,库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态库和动态库区别

  • 静态库:链接时,静态库会被完整的复制到可执行文件中,被多次使用就又多份冗余拷贝
  • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只会加载一次,多个程序共用,节省内存

注意:项目中如果使用了自制的动态库(framework)不能被上传到AppStore

.a和.framewrok有什么区别?

  • .a是一个纯二进制文件,.framework是一个文件夹,文件夹中除了有二进制文件之外还有资源文件。* .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。* .a + .h + sourceFile = .framework。

静态库的应用场景

  • 希望更多的开发者在程序中集成,但是又不想公布自己的核心技术;对外暴露统一接口,开发者调用静态库即可。
  • 项目开发中有一部分核心代码,非核心开发人员倘若离职,对于公司来说是一种损失

1. a静调库的编译

1.静态库的创建:左侧为.framework 右侧为.a

1.png

2.创建工具类,并暴露接口新建工具类,并在buildPhrase中添加需要暴露的.h文件

2.png

3.分别在不同的环境下编译,从而得到支持不同环境的静调库

3.png

4.查看不同环境下的静态库


4.png

在不同的文件夹下可以查看不同环境使用的.a静调库文件,新建项目,将.a文件拖拽到项目中估计可使用

5.png

静态库中的架构问题

当使用真机环境的.a文件在模拟中编译或者运行时,会报架构的错误 。

  • 设备的CPU架构

  • 不同的设备使用的CPU不同

  • CPU的不同就造成使用的CPU架构(即指令集)不同

  • 静态库有其支持的CPU架构

    • 如果静态库在其不支持的CPU架构上面运行就会报错
  • 模拟器使用的CPU架构

  • iPhone4s-iPhone5:i386

  • iPhone5s-iPhone6Plus:x86_64

  • 真机使用的CPU架构

  • iPhone3gs-iPhone4sP:armv7

  • iPhone5-iPhone5c:armv7s

  • iPhone5s-iPhone6plus:arm64

  • 注意: 支持armv7的静态库可以在armv7s上正常使用* 查看静态库的架构(终端命令)
    $ lipo -info 静态库地址

  • 合并静态库
    $ lipo create 静态库1 静态库2 output 合并后的静态库

如何使静调库支持多种CPU架构

想要制作的静态库既支持i386架构也支持x86_64架构,有两种解决方法.

  1. 修改静态库的编译环境并重新编译


    6.png

    在termnal中使用命令将多个静态库合并

 $ lipo -create Debug-iphoneos/libStaticLibrary.a Debug-iphonesimulator/libStaticLibrary.a -output libnewstatic.a

合并后的静调库的大小>=合并之前静态库大小之和
开发环境:需要支持真机以及模拟器的静态库
生产环境:只需要支持真机的静态库即可

2 .framework静态库的编译

第一步与.a文件文件创建一样,选择framework,点开以后发现,项目中已经存在一个与项目名称一样的主头文件(这是苹果推荐的方式 )
1.将需要暴露的头文件添加到public(拖入即可)

1.png

注意:将需要暴露的头文件放到主头文件中
2.步骤跟.a文件一致,分别在真机以及模拟器环境编译,得到两个不同环境的.framework

2.png

3.使用.framework并运行

3.png

查看控制台发现报错,发现制作的framework为动态库,动态库的使用,需要在target中手动添加动态库。(只能作为测试使用,苹果禁止自制的动态库上架,上架前切记修改为静态库)
4.修改编译环境,编译静态库buildsetting 搜索mach 并修改

4.png

使用该方法制作的静态库,可以运行,但是在4s中是无法运行的,会报CPU架构的错误,通过$lipo -info StaticFramework查看framework所支持的架构,目前这样制作的framework只支持x86架构,因此4s不能运行** 注意 :**cd 到.framework的路径是不够的,因为仅仅是一个文件夹,真正的静态库是一个二进制文件.因此查看架构信息的时候需要跟这个静态库名字修改架构,使制作的framework支持所有架构

5.png

静调库的合并与.a文件一样,在此就不做赘述。至此SDK的开发就到此为止,真正的SDK开发需要在项目中一边开发一边调试

3 SDK静调库的调试

单独进行核心代码SDK的开发,开发完成以后需要拖到项目中调试,这样是本末倒置的。SDK的开发需要在项目中调试以及开发。

6.png

创建完成以后,项目中的结构发生变化,变化的位置已经已经圈出

7.png

在framework文件目录下创建核心代码类,并在项目中需要的地方import主头文件,静调库的制作就不赘述了,与上面的一致。

4 制作静态库时注意的几点:

  1. 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源。
  2. category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC -all_load
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容