iOS-静态库的创建与使用

  在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来学习一下"iOS-静态库的创建与使用":

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

  (1)什么是库?

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

  (2)什么是静态库?

    ①静态库即静态链接库(例如: windows下的.lib、Mac和Linux下的.a);

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

    ③静态库的利弊:

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

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

  (3)什么是动态库?

    ①动态库即动态链接库(例如: windows下的.dll、Mac下的.dylib、Linux下的.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的架构上];

(三)制作静态库-Debug版本:

  (1)创建Cocoa Touch Static Library,新建项目选择iOS ->Framework&Library -> Cocoa Touch Static Library,如图1:

    

  (2)点击Next给工程命名如"Library"点击Next, Xcode自动为我们创建了Library.h/.m文件以及相对应的目录结构,如图2所示:

    

  (3)接下来我们在工程的.h和.m里面编写功能实现的代码(重在静态库的创建, 代码粗略请大家无视????):

 1 "Library.h"
 2 /** 十六进制转二进制 */
 3 + (NSString *)getBinaryByhex:(NSString *)hex;
 4
 5 "Library.m"
 6 + (NSString *)getBinaryByhex:(NSString *)hex {
 7     NSMutableDictionary  *hexDic = [[NSMutableDictionary alloc] init];
 8
 9     hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];
10     [hexDic setObject:@"0000" forKey:@"0"];
11     [hexDic setObject:@"0001" forKey:@"1"];
12     [hexDic setObject:@"0010" forKey:@"2"];
13     [hexDic setObject:@"0011" forKey:@"3"];
14     [hexDic setObject:@"0100" forKey:@"4"];
15     [hexDic setObject:@"0101" forKey:@"5"];
16     [hexDic setObject:@"0110" forKey:@"6"];
17     [hexDic setObject:@"0111" forKey:@"7"];
18     [hexDic setObject:@"1000" forKey:@"8"];
19     [hexDic setObject:@"1001" forKey:@"9"];
20     [hexDic setObject:@"1010" forKey:@"A"];
21     [hexDic setObject:@"1011" forKey:@"B"];
22     [hexDic setObject:@"1100" forKey:@"C"];
23     [hexDic setObject:@"1101" forKey:@"D"];
24     [hexDic setObject:@"1110" forKey:@"E"];
25     [hexDic setObject:@"1111" forKey:@"F"];
26
27     NSString *binaryString=[[NSMutableString alloc] init];
28
29     for (int i=0; i<[hex length]; i++) {
30         NSRange rage;
31         rage.length = 1;
32         rage.location = i;
33         NSString *key = [hex substringWithRange:rage];
34         binaryString = [NSString stringWithFormat:@"%@%@",binaryString,[NSString stringWithFormat:@"%@",[hexDic objectForKey:key]]];
35     }
36     return binaryString;
37 }

  (4)编译项目生成对应的静态库.a文件(在这里注意一下细节):

    ①在工程编译(Command+B)之前"标号为②的框框中libLibrary.a"为红色(编译之后为黑色, 红色表示一个虚拟的文件工程中找不到它),如图3所示:

      

    ②编译的过程中我们要选择"模拟器编译"和"真机编译",如图4图5所示:

        

  (5)右击工程目录下.a文件,查看编译之后的静态库文件如图6所示, 其中文件Debug-iphoneos里面包含iPhone真机所需要的libLibrary.a静态库文件,文件Debug-iphonesimulator里面包含的时iPhone模拟器所需要的libLibrary.a静态库文件,如图7所示;

      

  (6)分别查看打包好的模拟器与真机的静态库所支持的cpu架构:

    在上面我们介绍了iPhone设备CPU的架构,在这里我们就来查看我们所打包的静态库是否符合iPhone设备包含的架构标准(提示: 如果不符合某些架构的标准,静态库运行到不同机型上回报错误),打开终端查看静态库的架构如图8所示:

    

    我们找到原因如图9所示, 下面Debug:Yes表示只编译选中模拟器对应的架构,No则为编译所有模拟器支持的cup架构(Debug的Yes状态改为No即可);

    

    再一次Command+B 编译重复上面第(4)步的小步骤,就OK了,????...

  (7)合并静态库:

    ①为什么要合并静态库呢?

      因为真机和模拟器的静态库,是不一样的,不能同时适用在真机和模拟器上,但要满足这要求的话,要对编译好的两个静态库进行合并在使用;

    ②合并静态库的利弊?

      1)利: 开发过程中既可以在真机上调试,也可以在模拟器上调试;

      2)弊: 如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的;

    ③打开终端合并静态库(终于快成功了????...)如图10所示:

      

      其中完整的命令是:lipo -create /Users/apple/Library/Developer/Xcode/DerivedData/Library-bmlhmlslupltsqfkcfgmgqzducdy/Build/Products/Debug-iphoneos/libLibrary.a /Users/apple/Library/Developer/Xcode/DerivedData/Library-bmlhmlslupltsqfkcfgmgqzducdy/Build/Products/Debug-iphonesimulator/libLibrary.a -output /Users/apple/Desktop/libLibrary.a;

  (8)静态库的使用:

    将合并好的静态库文件(.a)和头文件(.h)添加到工程里面,调用静态库,结果如下(代码粗略请大家无视...):

 1 "ViewController.h"
 2 @interface ViewController : UIViewController
 3
 4 @end
 5
 6 "ViewController.m"
 7 #import "ViewController.h"
 8 #import "Library.h"
 9
10 @interface ViewController ()
11
12 @end
13
14 @implementation ViewController
15
16 - (void)viewDidLoad {
17     [super viewDidLoad];
18     // 十六进制转二进制
19     NSLog(@"十六进制转二进制: %@", [Library getBinaryByhex:@"F"]);
20 }
21
22 日志打印输入结果是:
23 静态库的使用[1006:40288] 十六进制转二进制: 1111

(四)制作静态库-Release版本:

  跟Debug版步骤一样,只不过在编译时,改下面的选项即可如图12所示:

  

  这时不管是真机还是模拟器都可以编译通过,正常运行;而使用者只能通过头文件知道我们提供的借口,却不知道实现文件中实现的细节,这有效地隐藏了自己的核心技术和机密内容;

(五)以上就是我对iOS静态库的理解与解释,希望大家相互补充相互学习;

时间: 2024-10-07 18:36:39

iOS-静态库的创建与使用的相关文章

IOS静态库

如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http://blog.ibireme.com/2013/09/18/create-ios-static-framework/ iOS开发--创建你自己的Framework http://www.cocoachina.com/ios/20150127/11022.html https://www.raywe

iOS开发——装逼技术精选&amp;全面了解 iOS 静态库开发

全面了解 iOS 静态库开发 简介 在企业开发中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把核心代码打包成静态库,只暴露头文件给程序员使用(比如:友盟.百度地图等第三方的sdk) 静态库和动态库的存在形式 静态库:.a 和 .framework 动态库:.dylib 和 .framework 静态库和动态库的区别 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统

ios静态库的使用

ios静态库的使用 2014-03-11 22:24 3906人阅读 评论(0) 收藏 举报 ios的静态库文件是*.a,如果需要使用它,我今天学的简单的方法,可通过,简单说说,如果有一个A手机项目,一个B的静态库项目,A想使用B.a,按以下的步骤: 1.在A项目里面拖进B项目.在B的product下面会看见红色的B.a,表示还没有编译通过(在工程设置里添加上你需要导出的.m文件). 2.选择好需要编译的对象,B下的某模拟器或者是B下的真机上进行编译(模拟器上生成的静态库和真机上生成的不能混用)

iOS 静态库,动态库与 Framework

iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件.另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间. 上面提到库在使用的时候需要

iOS 8:【转】封装iOS静态库注意事项

源地址:http://fann.im/blog/2014/01/12/ios-static-library/ 做一个 iOS 静态库需要注意的东西: namespace 冲突.静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库.解决办法就是把用到的第三方库加上自定义前缀,包括类名.delegate 协议.常量名,尤其需要注意 Category 的方法名要修改. 封装静态库的时候应尽量避免引入重量级第三方库,多自己进

封装ios静态库碰到的一些问题(二)

在静态库建立好了之后呢,于是应用程序就引用它,加上拷贝的h文件,但是引用之后Build之后提示很多sybmbol 重复 于是进行检查,确实由于是从其他工程修改过来的,很多基础库都引用了,删除之,最后就只剩下xxx.h,死活就是报重复符号,我看来看去都没有 不得其解,后面突然想不过,使用了下definition,发现跳转到了一个文件,里面全部被注释的文件,于是明了,原来偷懒,有的代码是拷贝的,于是h和m文件都在,但是里面内容被注释了,结果xcode不买账啊,直接删除掉,Ok,解决问题 封装ios静

iOS静态库.a文件制作和导入使用

iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Static Library工程. 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7

linux上静态库的创建和使用

静态库的概念: 我们知道程序编译一般需经预处理.编译.汇编和链接几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中.这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝. 静态库的创建: 比如我有如下一些操作数组的函数需要将他们做成静态库,方便在使用时不需要重复定义,array.h头文件如下: 1 #ifndef ARRAY_H_

ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)

创建静态库可能出于以下几个理由: 1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件.2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级.3.你想将库共享给其他人,但不想让他们看到你的源代码. Xcode6创建静态库详解(Cocoa Touch Static Library) 一.创建静态库文件 打开Xcode, 选择File ----> New ---> Project. 新建工程. 选择iOS ----> Framework & Library -

iOS 静态库制作及使用问题

参考:http://blog.163.com/const_yixinyiyi/blog/static/180088172201211113333882/ 静态库使用目标:(.a ) > 自己制作一个静态库(可以使用)(前三步) > 制作模拟器版本和真机版本 (第四步) > 合并两个版本 (第六步) 创建静态库步骤: 1. 选择要创建的文件类型:Cocoa Touch Static Library (.a文件) 2.将需要封装的文件导入其中 选择工程找到target(静态库) ->