一、简单介绍

1.什么是库?

  库是程序代码的集合,是共享程序代码的一种方式

2.库的分类

  根据源代码的公开情况,库可以分为2种类型

  (1)开源库

    公开源代码,能看到具体实现

    比如SDWebImage、AFNetworking

  (2)闭源库

    不公开源代码,是经过编译后的二进制文件,看不到具体实现

    主要分为:静态库、动态库

二、静态库和动态库

1.静态库和动态库的存在形式

静态库:.a 和 .framework

动态库:.dylib 和 .framework

2.静态库和动态库在使用上的区别

静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(图1所示)

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存(图2所示)

图1

  图2

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

三、静态库的制作(.a)

(1)选择“Cocoa Touch Static Library”

(2)输入静态库名称(以MJRefresh为例)

(3)删除自动生成的文件

(4)添加库需要包含的源代码

注意:资源文件是不能打包到.a文件中的。

(5)选择需要暴露出来的.h文件,.m文件会自动编译到.a文件中

  添加,并选择需要暴露的头文件

设置(移动)为公开的。

(6)选择真机设备,然后 Command+B 编译,libMJRefresh.a文件从红色变为黑色

  这个时候,程序会报错,因为框架中包含了CGFloat,它是UIKit里面的东西,因此可以在pch文件中包含UIKit框架。

  再次进行编译,编译成功后生成的.a文件就是静态库。

(7)选择模拟器,依然 Command+B ,模拟器和真机环境下用的.a文件是分开的

(8)右击“Show In Finder”,查看制作好的.a文件

说明:

Debug-iphoneos文件夹里面的东西是用在真机上的

Debug-iphonesimulator文件夹里面的东西是用在模拟器上的

如果Scheme是Release模式,生成的文件夹就以Release开头

(9)合并两个文件

如果想让一个.a文件能同时用在真机和模拟器上,需要进行合并

在终端输入指令:

  lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

说明:

蓝色部分是固定指令

红色、紫色是真机和模拟器.a文件的路径

绿色是所合成.a文件的路径

  生成的文件(静态库)

提示:

1)文件大小.a文件的体积(一般情况下)

  真机用的.a > 模拟器用的.a

  所合成.a == 真机用的.a + 模拟器用的.a

2).a的类型

    通过lipo –info libMJRefresh.a可以查看 .a 的类型(模拟器还是真机)

(10)如何使用.a

  直接将.a、.h、资源文件拖拽到其他项目中即可

  别人拿到的框架,只有.a文件和暴露出来的头文件

注意:如果库中还包含了一些资源文件(如图片等),那么资源文件也应该放在上面的文件夹中。

四、制作静态库的注意点

(1)注意:

  无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件

(2).a 和 .framework 的使用区别

  .a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用

  .framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

(3)图片资源的处理

  如果静态库中用到了图片资源,一般都放到一个bundle文件中,bundle名字一般跟 .a 或 .framework 名字一致

  bundle的创建:新建一个文件夹,修改扩展名为 .bundle 即可,右击bundle文件,显示包内容,就可以往bundle文件中放东西

 建议:自己制作的静态库中要用到的图片资源,不建议直接以png的后缀名方式拖到项目中使用,而是推荐使用放到bundle文件中。这样可以避免静态库的图片名和使用静态库的项目中存在的图片产生冲突。

  1)新建一个文件夹,把需要打包的资源图片放在里面

  2)修改扩展名为 .bundle,敲回车,点击添加。

(4)多文件处理

  如果静态库需要暴露出来的 .h 比较多,可以考虑创建一个主头文件(一般 主头文件 和 静态库 同名)

  在主头文件中包含所有其他需要暴露出来的 .h 文件

  使用静态库时,只需要#import 主头文件

  实际上苹果官方就是这么做的,例如:#import <UIKit/UIKit.h>

(5).framework为什么既是静态库又是动态库

  系统的 .framework 是动态库

  我们自己建立的 .framework 是静态库

(6)静态库中包含了Category(分类)

如果静态库中包含了Category,有时候在使用静态库的工程中会报“方法找不到”的错误(unrecognized selector sent to instance

解决方案:在使用静态库的工程中配置Other Linker Flags为-ObjC

iOS开发拓展篇—静态库相关推荐

  1. iOS开发拓展篇——如何把项目托管到GitHub

    iOS开发拓展篇--如何把项目托管到GitHub 说明:本文主要介绍如何把一个OC项目托管到Github,重操作轻理论. 第一步:先注册一个Github的账号,这是必须的 注册地址:Github官网注 ...

  2. iOS开发拓展篇—音频处理(音乐播放器3)

    iOS开发拓展篇-音频处理(音乐播放器3) 说明:这篇文章主要介绍音频工具类和播放工具类的封装. 一.控制器间数据传递 1.两个控制器之间数据的传递 第一种方法:self.parentViewCont ...

  3. iOS开发拓展篇—CoreLocation简单介绍

    iOS开发拓展篇-CoreLocation简单介绍 一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 ...

  4. iOS开发拓展篇—CoreLocation地理编码

    iOS开发拓展篇-CoreLocation地理编码 一.简单说明 CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写. 1.使用CLGeocoder可以完成" ...

  5. iOS开发拓展篇-XMPP简单介绍

    iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...

  6. (0054)iOS开发之制作静态库详解

    最近在做Apple的IOS开发,有开发静态库的需求,下面就简单写一个静态库和一个调用静态库的例子. 静态库的编写: 1. 静态库工程的建立: Xcode New一个新的project,选择IOS下面的 ...

  7. iOS开发拓展篇—蓝牙之mutipeerConnectivity的使用

    蓝牙 mutipeerConnectivity 简介 * iOS 7引入的一个全新框架 * 多点连接 * 替代GameKit框架 * 多用于文件的传输 * iOS设备不联网也能跟附近的人聊天 * Fi ...

  8. iOS开发拓展篇—音频处理(音乐播放器6)

    一.图片处理 说明: Aspect表示按照原来的宽高比进行缩放. Aspectfit表示按照原来的宽高比缩放,要求看到全部图片,后果是不能完全覆盖窗口,会留有空白. Aspectfill表示按照原来的 ...

  9. iOS开发拓展篇—音效的播放

    一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称"短音频",通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的&quo ...

最新文章

  1. C语言小游戏——三子棋
  2. 由一次WCF项目的需求扩展想到的
  3. iar stm32_STM32延时函数的四种方法
  4. java 控制语句_java两个控制语句(转)
  5. tomcat配置SSL加密网站
  6. 2月21日 CVST工具箱模块仿真与图像处理(一)
  7. 智能混音插件 – iZotope Neutron Advanced 3.11 win-mac
  8. LaTeX插入参考文献并引用
  9. CTF pyc之stegosaurus隐写
  10. Vivado安装使用【Verilog】
  11. 进入fastboot模式后,一连接刷机助手就变成press any key to shutdown
  12. JAVA企业邮箱发送
  13. 怎么将静图变动图?用这个网站就够了
  14. 全栈学习日记001--穿过黑色12月,在2021年第二周的开始见到曙光,朝着光一直走下去吧
  15. 万卷书 - 研究巴菲特 [Buffettology]
  16. mel表达式_表达式和 MEL 语法之间的区别
  17. 学习Python中turtle模块的基本用法(3:学习绘图示例源码)
  18. linux下串口设备文件,linux下各种串口调试助手
  19. 诺基亚被中国联通选中驱动该公司在北京的4G和5G网络
  20. java.lang.NoSuchFieldError: No static field id_sl_hlry of type I in class Lcom/bsoft/mob/common/R$id

热门文章

  1. IOS中Json解析的四种方法
  2. CCNA战报每日更新
  3. iOS12系统应用发送普通邮件构建邮件
  4. Kail Linux渗透测试教程之网络扫描和嗅探工具Nmap
  5. c ef框架-mysql_.net EF框架 MySql實現實例
  6. jq 控制td只显示一行_9月22日现货黄金、白银TD、黄金TD、纸黄金、纸白银价格走势分析...
  7. python做数据透视表_Python--数据透视表和交叉表、数据读取
  8. c语言整形数组相加,[c语言]将两个整形升序数组合并为一个升序数组
  9. iOS 隐藏下级页面的tabbar的统一处理
  10. Elon Musk的OpenAI用VR训练机器人:解锁更多复杂动作!