静态库

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

根据源代码的公开情况,库可以分为2种类型
开源库
公开源代码,能看到具体实现
比如SDWebImage、AFNetworking

闭源库
不公开源代码,是经过编译后的二进制文件,看不到具体实现
主要分为:静态库、动态库

静态库和动态库的存在形式
静态库:.a 和 .framework
动态库:.dylib 和 .framework

静态库和动态库在使用上的区别
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝(左图所示)
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

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

静态库制作

编写业务类:

//
//  HJTool.h
//  static
//
//  Created by HJiang on 15/3/23.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface HJTool : NSObject

+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;

@end
//
//  HJTool.m
//  static
//
//  Created by HJiang on 15/3/23.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#import "HJTool.h"

@implementation HJTool

+ (NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2{
    return num1 + num2;
}

@end

编译项目:

command+B,得到.a和暴露的.h文件

新建测试静态项目

测试通过

使用模拟器iphone4s测试

解决办法:
方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件)
    项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO
方法2:把i386和x86_64的2个静态库文件合成一个静态库使用
静态库的合并
================================================================================

# 检测.a的类型
$ lipo -info libHJTools.a

# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

# 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本

把静态库项目配置修改重写编译

重写导入新的.a文件运行在iphone4s正常

/*

 Undefined symbols for architecture i386:

 静态库不能在使用i386架构的cpu设备上面运行

 

模拟器架构:

 i386 : iPhone模拟器 3gs->iPhone5

 x86_64 : iPhone模拟器 5s->6plus

查看.a架构命令 

 lipo -info 静态库:查看该静态库支持哪些架构

 

真机架构

 armv7 : iPhone 3gs->4s

 armv7s : iPhone 5->5c 

 arm64 : iPhone 5s->6plus

 */

笔记:

问题一: 静态库.a文件始终为红色,显示编译不成功。

解决办法:这是xcode的一个bug,先将编译模式设置为device,编译成功,再切换回simulator模式即可编译simulator对应的.a文件

新建静态库项目

1.编译项目,获取.a文件,如需暴露.h文件,再项目->target->Build Phases->Copy Files->导入需要暴露的头文件和.m文件(一般只暴露.h文件)

在其他项目中导入静态库就可以使用静态库
2.如果是生成的x86_64的静态库,在i386处理器上运行会出现异常
解决办法:
方法1: 修改静态库项目中的配置(可以生成支持i386和x86_64 2个版本的.a文件)
    项目> target -> Build settings -> Combined -> Architectures ->Build Active Architecture Only -> 修改Debug为NO
方法2:把i386和x86_64的2个静态库文件合成一个静态库使用
静态库的合并
================================================================================

# 检测.a的类型
$ lipo -info libHJTools.a

# 合并.a
lipo -create Debug-iphoneos/libTools.a Debug-iphonesimulator/libTools.a -output libTools.a

# 合并.a的好处,开发过程中既可以在真机上调试,也可以在模拟器上调试
# 合并.a的坏处,如果静态库太大,合并打包后,会非常大,因此很多第三方的静态库的.a是区分版本的
# 今后在使用.a时一定注意版本

3.生成调试和正式版本
选择项目 > Edit Scheme >Run > info >Build configuration >Debug|Release
这样选择后就可以生成调试或正式版本(发布或调试).a信息

静态库的种类

================================================================================

静态库文件的版本(4种)

1.真机-Debug版本

2.真机-Release版本

3.模拟器-Debug版本

4.模拟器-Release版本

调试版本(Debug版本) VS 发布版本(Release版本)

--------------------------------------------------------------------------------

- 调试版本会包含完整的符号信息,以方便调试

- 调试版本不会对代码进行优化

- 发布版本不会包含完整的符号信息

- 发布版本的执行代码是进行过优化的

- 发布版本的大小会比调试版本的略小

- 在执行速度方面,调试版本会更快些,但不意味着会有显著的提升


二.在application项目中添加静态库项目
1.项目- >Target>左下角 添加静态库项目>
2.项目-》target>添加frameWork(指定.a文件)


动态库
1.新建动态库

2.添加动态库至项目中
  2.1 修改动态库的导入 - 删除target>general>Linked framework
    添加二进制文件 ->Embedded Binaries >导入动态库

#warning
在制作库时,图片等资源不会包括在.a库中(所以制作库时,库中使用到的资源也需要单独和库一起发布出来)
需要在导入库到项目中时还需要导入资源文件
资源文件需要库提供者一起提供出来

静态库中的资源包的使用

================================================================================

问题:有些第三方库会使用到一些图片素材,例如公司的logo等。


但是由于Xcode默认在编译时会把所有的素材文件导入到mainBundle中,为了避免与使用静态库的程序冲突。


在静态库中如果要使用图片素材,会利用bundle的手段

1>  建立bundle,并且向其中添加图片


2>  创建一个类方法,返回图片


3>  编译


4>  调用方如果需要使用,需要导入 .h + .a + XXX.bundle


Bundle资源
怎么制作bundle?
新建文件夹>把文件夹后缀修改为Bundle
显示bundle文件内容,把资源放入就可以了
原文地址:https://www.cnblogs.com/HJiang/p/4359340.html