ios开发中创建静态库的方法介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios开发中创建静态库的方法介绍相关的知识,希望对你有一定的参考价值。

在进行ios项目开发时,为了减少项目的编译时间,通常情况下会把项目中的私密内容打包成静态库,或者是把ios项目中变动较少一部分打包成静态库以便提高编译效率,很多iOS初学者对静态库与动态库的区别及创建使用,下面就一起来学习下:

()iOS静态库、动态库与Framework静态库与动态库的区别:

(1)什么是库?

(Library)直白一点说就是一段编译好的二进制代码,加上头文件就可以供别人使用;(例如: iOSObjective-C编译下的.h.m文件,打包静态库后会变为.h.a文件);

(2)什么是静态库?

静态库即静态链接库(例如: windows下的.libMacLinux下的.a);

静态库在编译的时候会被直接拷贝一份,复制到目标程序里并且这段代码在目标程序里就不会在改变了,我猜这也是该库叫"静态库"的原因;

静态库的利弊:

1)静态库在编译完成之后,库文件实际上就没有作用了,目标程序没有外部依赖,直接就可以运行;

2)弊端静态库会使用目标程序的体积增大;

(3)什么是动态库?

动态库即动态链接库(例如: windows下的.dllMac下的.dylibLinux下的.so);

与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用,等到程序运行时,动态库才会被真正加载进来;

动态库的利弊:

1)不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库); 同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码;

2)动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境;如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行;

(4)什么时候我们会用到库呢?

某些代码片段需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件;

对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间;

说明:上面提到库在使用的时候需要Link,Link 的方式有两种:静态和动态,于是便产生了静态库和动态库("攻城狮"的思维就是这么简单

(5)iOS Framework?

除了上面我们提到iOS.a.dylib之外,Mac OS/iOS 平台还可以使用 Framework,Framework实际上是一种打包方式,将库的二进制文件、头文件和有关的资源文件打包到一起,方便管理和分发;在 iOS 8 之前,iOS 平台不支持使用动态 Framework,开发者可以使用的 Framework 只有苹果自家的 UIKit.Framework,Foundation.Framework 等等;

上面这种限制可能是出于安全的考虑,换一个角度讲,因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码,同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势,实际上动态库也就没有存在的必要了;

由于上面提到的限制,开发者想要在 iOS 平台共享代码,唯一的选择就是打包成静态库 .a 文件,同时附上头文件;但是这样的打包方式不够方便,使用时也比较麻烦,大家还是希望共享代码都能能像 Framework 一样,直接扔到工程里就可以用;

终于在日思夜盼便迎来了iOS对动态库的支持: iOS 8/Xcode 6 推出之后,iOS 平台添加了动态库的支持,同时 Xcode 6 也原生自带了 Framework 支持(动态和静态都可以);

但是说道这里博主要告诉一下大家,iOS动态库且用且珍惜(小心应用审核被拒

()切入主题"iOS静态库的创建":

(1)我们先了解静态库文件的版本(四种):

真机-Debug版本; 真机-Release版本 模拟器-Debug版本 模拟器-Release版本;

(2)Debug(调试)版本特点:

含完整的符号信息,以方便调试; 不会对代码进行优化;

(3)Release(发布)版本特点:

不会包含完整的符号信息; 执行代码是进行过优化的; 大小会比Debug版本的略小 在执行速度方面,Release版本会快一些;

所以我们一般开发中都打包Release(发布)版本使用;

(4)再来了解一下iPhone设备CPU的架构简介:

模拟器: (4s~5: i386) (5s~6splus: x86_64)

真   : (3gs~4s: armv7)   (5~5c: armv7s)   (5s~6splus: arm64)[说明静态库只要支持了armv7,就可以跑在armv7s的架构上];

以上是关于ios开发中创建静态库的方法介绍的主要内容,如果未能解决你的问题,请参考以下文章

iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?

李洪强iOS开发之静态库的打包一

在 iOS 中使用静态库的“架构 i386 的未定义符号”

涉及 NSDocumentDirectory 和其他 iOS App 特定调用的静态库的单元测试

iOS SDK开发汇总

iOS:Xcode7创建静态库