iOS静态库小结--(yoowei)
准备知识:
1.什么是库?
库是程序代码的集合,是共享程序代码的一种方式
2.根据源代码的公开情况,库可以分为2种类型
a.开源库
公开源代码,能看到具体实现 ,比如SDWebImage、AFNetworking
b.闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现。主要分为:静态库、动态库
3.静态库和动态库的存在形式
静态库:.a 和 .framework
动态库:.dylib 和 .framework
4.静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
5.创建静态库可能出于以下几个理由:
1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件。
2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级。
3.你想将库共享给其他人,但不想让他们看到你的源代码。
4.比如很老的框架使用的是MRC环境下面的框架,那么我们只需要将其打包成静态库就可以了,这样就不用担心是不是ARC环境了。
Xcode创建静态库详解(Cocoa Touch Static Library)(本人使用的是Version 6.3)
一、创建静态库文件(.a 文件)
打开Xcode, 选择File ----> New ---> Project。
选择iOS ----> Framework & Library ---> Cocoa Touch Static Library。
点击Next。按照流程一步一步的创建工程。



注意静态库文件的版本(4种)
1.真机-Debug版本
2.真机-Release版本
3.模拟器-Debug版本
4.模拟器-Release版本
就是在build configuration 里面进行调整一下debug和release,然后分别在真机和模拟器上面进行编译。

结果如下图:

调试版本(Debug版本) VS 发布版本(Release版本)
--------------------------------------------------------------------------------
- 调试版本会包含完整的符号信息,以方便调试
- 调试版本不会对代码进行优化
- 发布版本不会包含完整的符号信息
- 发布版本的执行代码是进行过优化的
- 发布版本的大小会比调试版本的略小
- 在执行速度方面,调试版本会更快些,但不意味着会有显著的提升
所以我们建议在产品即将上线的时候要进行如下图的调整:


二、应用静态库文件(.a 文件)
1.想让静态库文件給别人使用,需要将头文件暴露給别人。按着下面的步骤将头文件添加进来。


再点击libstatic.a右击show In Finder 就可以查看如下图:

2.然后将静态库拖进项目中。就能利用头文件了
 
 
3.因为无论是模拟器还是真机都有不同的架构。所以经常会出现如下找不到某个架构的错误

为了解决各个机型的模拟器都能用可以有2种方法:
1.合并各个静态库(在终端中执行如下操作)

XQdeMac-mini:~ ioswy$ cd /Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products/Release-iphonesimulator5s
XQdeMac-mini:Release-iphonesimulator5s ioswy$ lipo -info libstatic.a
Architectures in the fat file: libstatic.a are: i386 x86_64
XQdeMac-mini:Release-iphonesimulator5s ioswy$ cd /Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products/Release-iphonesimulator6
XQdeMac-mini:Release-iphonesimulator6 ioswy$ lipo -info libstatic.a
Architectures in the fat file: libstatic.a are: i386 x86_64
1》.我们可以cd到.a文件所在文件夹的当前目录
2》.再执行 lipo -info 静态库.a文件
这样就可以查询该静态库支持的架构是什么。
回到.a文件所在文件夹所在的文件夹目录:cd ..
XQdeMac-mini:Release-iphonesimulator6 ioswy$ cd ..
XQdeMac-mini:Products ioswy$ pwd
/Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products

合并2个静态库
XQdeMac-mini:Release-iphonesimulator6 ioswy$ cd ..
XQdeMac-mini:Products ioswy$ pwd
/Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products
XQdeMac-mini:Products ioswy$ lipo -create Release-iphonesimulator5s/libstatic.a Release-iphonesimulator6/libstatic.a -output lib.a
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: Release-iphonesimulator5s/libstatic.a and Release-iphonesimulator6/libstatic.a have the same architectures (i386) and can't be in the same fat output file
由于2个静态库都含有相同的架构,所以出现错误,因为我们合并的是在Release-iphonesimulator6和Release-iphonesimulator5s之间的,都是模拟器。其实我们在制作静态库的时候,无论是在模拟器还是真机的时候,设置Build Active Architecture Only为no的话,一次打包,如果是模拟器就会适用所有机型的模拟器,如果是真机的话就会适用所有机型的真机。实际上我们通常合并的是模拟器和真机的静态库。
合并模拟器和真机的静态库,步骤如下:
合并前:

XQdeMac-mini:~ ioswy$ cd /Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products/Debug-iphonesimulator
XQdeMac-mini:Debug-iphonesimulator ioswy$ lipo -info libstatic.a
input file libstatic.a is not a fat file
Non-fat file: libstatic.a is architecture: x86_64
XQdeMac-mini:Debug-iphonesimulator ioswy$ cd /Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products/Debug-iphoneos
XQdeMac-mini:Debug-iphoneos ioswy$ lipo -info libstatic.a
Architectures in the fat file: libstatic.a are: armv7 arm64
XQdeMac-mini:Debug-iphoneos ioswy$ cd ..
XQdeMac-mini:Products ioswy$ pwd
/Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products
XQdeMac-mini:Products ioswy$ lipo -create Debug-iphonesimulator/libstatic.a Debug-iphoneos/libstatic.a -output lib.a
合并后:

合并后的lib.a同时支持:armv7 x86_64 arm64 架构。(可以看出在制作模拟器的静态库的时候并没有设置Build Active Architecture Only为no)
XQdeMac-mini:Products ioswy$ cd /Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products
XQdeMac-mini:Products ioswy$ pwd
/Users/XQ/Library/Developer/Xcode/DerivedData/static-bdsgvzfqigaspiaeivnhmmygrhgj/Build/Products
XQdeMac-mini:Products ioswy$ lipo -info lib.a
Architectures in the fat file: lib.a are: armv7 x86_64 arm64
2.可以通过配置

小结一下:
1.编译静态库:项目->Build Phases->Copy File->添加头文件
2.模拟器编译时,挑选高版本(向下兼容,低版本不能在高版本运行)
3.静态库分真机版本和模拟器版本(必须在对应的版本运行)
4.合并真机版本和模拟器版本(常用)
lipo -create 真机.a 模拟器.a -output 结果.a
合并版本更大,开始时使用方便(所以可以开发时使用合并版本,发布时,使用真机版本)
5.release版本和debug版本:
debug版本:调试版本,没有任何优化,也就是说各种错误信息,都将抛出和检测,相对来说性能低一点,但是方便调试
release版本:发布版本,进行了优化,执行效率更高
提醒:实际开发当中,项目完成后,在debug版本上没有问题了,一定要去release版本上调试一下,否则也许可能发生一些bug。
三、调试静态库文件(.a 文件)
因为静态库也是需要不断的开发,调试,最终才能完美,所以我们应该是不断的开发,不断的调试,那么像上面的那种方式直接建立一个静态库项目就很麻烦,所以我们应该是在某一个 项目中添加一个静态库文件,那么就可以做到不断开发,不断调试。
1.添加静态库target:项目->General->左下角+->添加静态库(StaticLib)
2.在StaticLib文件夹内就可以就行开发静态库
3.项目引入静态库:项目->General->Linked Frameworks and Libraries->添加静态库
4.导出静态库:选择左上角房子->同之前导出方式(也就是分别在模拟器和真机上面进行编译)。



(注意:如果是动态库的话,上面的Embedded Binaries 也要导入相应的库 )
总体思路是我们在项目中新添加静态库target,然后在项目中导入静态库文件,这个时候scheme选中原本项目(注意是项目),进行编译看是否通过。所以我们可以通过这样的方法进行调试静态库,如果真的调试到没有错误的时候,可以将scheme处选择成小房子(静态库),然后编译就可以生成相应的静态库。这样我们就可以边开发边经行静态库的调试。
四、静态库文件(.framework 文件)
1.怎么创建.framework?
打开Xcode, 选择File ----> New ---> Project。
选择iOS ----> Framework & Library ---> Cocoa Touch Static Library。
点击Next。按照流程一步一步的创建工程。



设置之后,分别选中模拟器和真机进行编译。
2.为.framework添加头文件,如下图进行操作。


3.测试.framework
注意测试.framework时候 导入头文件的时候如下。
#import <MyFrameWork/staticTest.h>
4.注意 .framework 创建后默认是动态库

5.如果我们用了自己的动态库的话,那么是不可能上传appstore上面的,所以我们需要将其编译成静态库。编译成静态库是需要在编译之前做一下如下设置


五、.bundle文件的使用
有一种情况就是我们静态库里面的图片很可能跟我们项目里面的图片名字一样,就有可能将项目中的图片给覆盖掉,那么冲突就有了,所以静态库就有了存放图片的bundle。
我们需要建立一个bundle来存储文件。其实bundle就是一个特殊的文件夹,只不过是将文件夹命名为后缀为.bundle就行了。点击显示包内容,可以将图片拷贝进去。

向项目中拖入静态库的时候一定要将bundle 也拖进去,
这样的话加载图片的时候

就不能用

iOS静态库小结--(yoowei)的更多相关文章
- iOS - 静态库的创建与使用
		在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ... 
- IOS静态库
		如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ... 
- iOS静态库.a文件制作和导入使用
		iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ... 
- iOS静态库 ---iOS-Apple苹果官方文档翻译
		iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ... 
- iOS静态库的制作与引用
		[iOS静态库的制作与引用] 1.Configuring Exported Headers To configure which headers are exported to clients, se ... 
- iOS 静态库,动态库与 Framework
		iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢 ... 
- 判断IOS静态库(.a文件)是否支持模拟器和真机运行
		判断IOS静态库(.a文件)是否支持模拟器和真机运行 在mac终端下,进入到.a文件目录下,然后输入: lipo -info libMyAlertView.a Architectures in the ... 
- iOS静态库转Framework动态库
		参考文章: iOS静态库(.a 和framework) XCode6制作动态及静态Framework 说说iOS中静态库的开发 dyld: Library not loaded: @rpath/ ... 
- iOS静态库.a总结(2017.1.24增加脚本打包方法)
		修改于:2017.1.24 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.根据源代码的公开情况,库可以分为2种类型 a.开源库 公开源代码,能看到具体实现 ,比如SDWebImag ... 
随机推荐
- 【转】ListView学习笔记(二)——ViewHolder
			在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候, ... 
- BZOJ 1112: [POI2008]砖块Klo
			1112: [POI2008]砖块Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1736 Solved: 606[Submit][Statu ... 
- 表头不动,内容滚动的例子(纯css+html)
			<!doctype html> <html> <head> <meta charset="utf-8"> <title> ... 
- codevs1091 传染病控制
			题目描述 Description [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完 ... 
- 前端打包/自动化构建工具:gulp
			glup可以进行打包,并且可以实现类似/script/test-adsf123.js或者/script/test.js?v=asdf123 参考: http://www.ydcss.com/archi ... 
- Jenkins与Hudson的关系
			Jenkins的前身是Hudson(Sun开发),2010年从Hudson分支出来. 由于Sun被Oracle收购,Oracle拥有Hudson的商标所有权.分支出来的Jenkins将继续走open ... 
- Codeforces Round #389 Div.2  A. Santa Claus and a Place in a Class
			time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ... 
- TYVJ1427 小白逛公园
			时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个 ... 
- python图形界面(GUI)设计
			不要问我为什么要用 python 来做这种事,我回到“高兴咋地”也不是不可以,总之好奇有没有好的解决方案.逛了一圈下来,总体上来说,python 图形界面有以下几个可行度比较高的解决方案. 1. py ... 
- POJ2239 Selecting Courses(二分图最大匹配)
			题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ... 
