一.基础知识
1.库是程序代码的集合,是共享程序代码的一种方式
2.根据源代码的公开情况,库可以分为两种类型:
- 开源库:能看到具体实现,比如:
SDWebImage
、AFNetworking
- 闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体实现,分为两种:
静态库
和动态库
3.静态库和动态库
静态库:.a
和.framework
动态库:.dylib
和.framework
4.添加库的步骤:
“选中工程”—–>”General”—–>”Linked Frameworks and Libraries”
5.静态库和动态库在使用上的区别:
- 静态库:链接时,静态库会被完整地复制到可执行文件(即App程序),被多次使用就有多份冗余拷贝;
- 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序应用,节省内存(项目中如果使用了自制的动态库,不能被上传到AppStore)
二.如何学习系统的框架(例如UIKit
框架)
以UIKit
框架为例,按照上述方法将UIKit
框架添加到工程下,并将框架展开:
这样,我们就可以查看框架中的头文件了,系统会将类和方法暴露在头文件中。
三.关于系统架构的知识:
模拟器:
- i386:3gs –> iPhone5
- x86_64:5s –> 6Plus
真机:
- armv7:iPhone 3gs –> 4s
- armv7s:iPhone 5 –> 5c
- arm64:iPhone 5s –> 6Plus
四.制作我们自己的静态库<1>.a
- 命令
lipo -info 静态库
可以查看该”静态库”支持哪些架构 - 命令
lipo -create 静态库1 静态库2 -output 静态库3
可以将”静态库1”和”静态库2”合并
步骤:
1.新建”Cocoa Touch Static Library”项目,命名为SStool
:
创建好后,效果如下:
可以看出,系统为我们创建了两个文件:SStool.h
和SStool.m
也要注意:此时Products
目录下的libSStool.a
文件是红色的。
2.为了使我们创建的静态库同时支持系统的几种架构,如下设置:
“选择工程”–>”Build Settings”–>”Architecture”–>”将Build Active Architecture Only设置为No”
3.删除系统为我们创建的文件,即SStool.h
和SStool.m
,新建一个类SSsum
类:
#import <Foundation/Foundation.h>
@interface SSsum : NSObject
//the function is to calculate the sum of numbers
+(NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2;
@end
#import "SSsum.h"
@implementation SSsum
+(NSInteger)sumNum1:(NSInteger)num1 num2:(NSInteger)num2{
return num1+num2;
}
@end
假设以上就是我们的库所有的文件。
4.为了让我们的库能够让别人使用,我们需要暴露我们的头文件:SSsum.h
,为了实现这个目的,步骤:”选中工程”–>”Build Phases”–>”Copy Files”–>”将我们要暴露的头文件添加”
5.编译我们的库文件:”Command+B”,需要注意的是:我们既要在模拟器上编译,也要在”IOS Device”状态下编译,编译后如下:
此时,发现libSStool
颜色变黑了。
6.检查我们制作的库文件:”选中libSStool”–>”show in Finder”
使用lipo info-
查看我们的库文件:
可以看出,完全支持系统的几种架构。
7.使用我们制作的库文件:
“将创建好的库文件拖入新创建的工程中”–>”导入头文件SSsum.h”
五.如何在开发中调试静态库
1.创建一个项目,项目面板如下:
2.在刚刚创建的项目中创建"Cocoa Touch Static Library"
:点击中间面板左下角的”+”符号创建。
创建好后,文件面板的效果如下:
可以看出,有四处不同之处,已用红色箭头标出。
3.调试创建的库:首先将我们创建的库添加到工程中(选中工程,而不是静态库,”General”—>”Linked Frameworks And Libraries”)
然后在视图控制器中导入头文件引用即可
六.制作静态库时有图片等资源时:需要将资源单独加载,即将资源拖到使用静态库的工程中。问题是:静态库需要的资源可能会与工程中的资源名称相同,解决方法是:制作静态库所需要的资源放在Bundle
里面。
制作Bundle
文件:新建一个文件夹,扩展名为.bundle
即可,”右键”–>”显示包内容”–>”往里面添加资源即可”
七.制作我们自己的静态库<2>.framework
步骤:
1.创建一个”Cocoa Touch Framework”工程:
2.新建一个类SSlog
,里面包含我们需要的功能。
3.设置开放的头文件: Framework中有些类可能是一些私有的辅助工具,不需要使用者看到,在这里只需要把开放出去的类放到Public下:
这样生成的Framework的Headers目录下也只能看到Public的头文件
4.设置静态库:将”Build Settings”—>”Linking”–>”Mach-o Type”,设置为”Static Library”
如果没有这步的,默认是动态库