怎么打静态库.a及注意事项

来源:互联网 发布:js require的用法 编辑:程序博客网 时间:2024/06/09 18:36

在项目开发过程中,经常出现优秀代码重用现象,又或者提供给第三方功能模块却又不想让其看到源代码,这些时候,通常的做法是将代码封装成库或者框架,这些在Windows编程或Linux编程中非常容易实现的过程,在iOS开发中却遇到了麻烦,原因是:苹果公司禁止在iOS开发中使用动态库(而苹果自己却可以使用动态库),同时,苹果也从Xcode中移除了创建静态框架的功能。值得庆幸的是我们可以通过对Xcode进行小小的改动来创建静态框架,而静态库和静态框架是被App Store所允许的,其实静态框架本质上说也是静态库的一种。

在正式的上代码之前,先介绍一些从网上搜集的静态库相关的基本概念,以加深对后面知识的理解

1.  库

       库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。

2.  区别

       静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

       动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。

3. iOS中静态库的形式

       在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。

       之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库(无可奈何啊)。

4. .a与.framework的区别

        二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。

5. 静态库使用的必要性

    1>.  代码的共享与重用

    2>.  程序模块化

    3>.  分享给别人代码库时代码隐藏

    4>.  开发第三方SDK

6. 对图片资源和UI界面xib或nib文件的处理

           .a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。关于bundle文件的制作方法,后面有专门介绍。

    有个疑问:

           .a文件中无法存放图片或xib文件,很容易理解,但是.framework从本质上说也是一个bundle文件,为什么不把图片或者xib文件直接放在.framework中而单独再创建个bundle文件呢?

           那是因为iOS系统不会去扫描.framework下的图片等资源文件,也不会在项目中显示,也就是说即使放在.framework目录下,系统根本就不会去扫描,因此也无法发现使用。

7. category的处理

       category是项目开发中经常用到的,把category打包成静态库是没有问题的,但是在使用这个静态库时,调用category中的方法时会发生找不到该方法的运行时错误(selector not recognized),解决的办法是在使用静态库的工程中配置other linker flags的值为 -ObjC  -all_load

8.项目遇到的问题

        菜鸟第一次打库,真的都给我打哭了,真的是各种Google,各种stackoverflow,终于貌似成功了,可是还是有问题的,什么问题呢,就是我在跑项目的时候出现了一个无名bug,这个bug是什么呢?我打了几个静态库放在项目中了,可是报错了,但是不是我这几个库的bug,这就奇怪了,我就没link这个库,怎么会这样?原因是这样的:唉,菜鸟还是菜鸟,我用真机打成了那几个库,然后移植到项目中,我用模拟器跑就出这种莫名的bug了,知道了问题出在哪里,我就用模拟器重新打库,然后移植到项目中,重新跑,build succeed!感谢苍天!

9.怎么打库(图文版教程)waring:看你是用什么来build这个库了,如果你是用模拟器,如下图中的build,那么就是一个模拟器库,这个库是只能在模拟器上使用的,如果你是用generic ios device 来build项目的话,那么就是一个真机库,是只能在真机上使用的,当然了,真机库和模拟器库是可以合并的,不然怎么玩。。。合并生成通用库详见我另一篇博客:合并生成通用库(真机模拟器公用)链接博客

1.build项目


2.找到打好的库,然后show in finder


3.在finder中找到.a库后,copy到桌面上


4.拖到项目中

5.build

1 0