iOS初体验---静态库

今天新公司要求对代码进行封装,也就丢下一句不让别人看见源码 就没了。。快哭了

然后我就开始各种百度 && google了。。。。(原谅我这个iOS开发新人吧)

功夫不负有心人,终于找到了两种:分别是framework 和 .a  

读了 《iOS 静态库开发》获益匪浅,就仿照做了下面例子

一、基础信息展示

1、静态库与动态库的区别:

静态库:连接时完整的拷贝至可执行文件中,被多次使用就有多分冗余拷贝。

动态库:连接时不复制,程序运行时由系统动态加载到内存中,共程序调用,系统只加载一次,多个 程序公用,节省内存。

2、iOS中库的形式:

iOS中静态库的形式:.a 和 .framework(自建)

iOS中动态库的形式: .dylib 和 ,framework(系统)

3、.a 和 .framework的区别:

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

.a 文件不能直接被使用,需要有.h文件配合,.framework文件可以直接使用。

.a + .h + sourcefile =  .framework。

这里面有个问题。就是感觉.framework既然除了存放.m和.h文件 又能存放各种图片或者其他资源文件。为什么很多

第三方sdk 很多都使用的是 静态库+ bundle?

后来查资料发现,系统是不会去扫描.framework下的图片等资源文件。也是不会在项目中显示,也就

是说framework中的资源只是被framework中文件自己调用,第三方sdk将资源图片打包为bundle 是方便了公开调用,

近而解决静态库中图片等资源不能使用的问题。

4、编译模式

Debug-iphoneos 真机

Debug-iphonesimulator 模拟器

5、debug 和 release的区别

Debug(调试)版本

1.含完整的符号信息,以方便调试

2.不会对代码进行优化

Release(发布)版本

1.不会包含完整的符号信息

2.的执行代码是进行过优化的

3.的大小会比Debug版本的略小

4.在执行速度方面,Release版本会更快些(但不意味着会有显著的提升)

二、生成静态库代码模块

我使用的是Xcode7,好!让我们开始:
新建一个静态库的项目。

给项目起个名字,会生成如下的结构

其中Copy Files 中的.h文件是暴露在外面的,供外部方法调用,如果你要是新建了类文件并且希望能被外部调用,就把.h 文件放在这里。

代码如下:
testPlugin.h 代码
#import <UIKit/UIKit.h>

@interface testPlugin : NSObject
-(void )showParam:(NSString *)param;
-(NSString *)showParams:(NSString *)param;
@end
</span>

testPlugin.m 代码
#import "testPlugin.h"

@implementation testPlugin
-(void )showParam:(NSString *)param{
    NSLog(@"%@",param);
}
-(NSString *)showParams:(NSString *)param{
    NSString *param2 = [param stringByAppendingString:@"_test"];
    return param2;
}
@end</span>



现在是重头戏,就是要开始编译,之前自己在这个地方进坑
跳出一大堆无关紧要的,直接做通用版本的:


选择iOS Driver 和 simulators 运行编译,



按照上述的操作,进入到该文件夹可以发现真机和模拟器编译好的  .a静态库文件和 include文件 (文件夹里就是要暴露在外的.h的文件)
这时候需要将两个文件合并
找到两个.a静态包的地址 然后合并

lipo -create 完整路径/xxx.a  完整路径/xxx.a   -output xxx.a  

你是在什么目录下执行该条命令 新生成静态包就是在当前目录,可以在output 后面加上路径
这个是在debug模式下两个包合并,应该不能跟release 版本混在一起合并(这部分没有测试)

最后 你所有需要的通用静态库文件 + 之前的 .h文件  就成功了。


ps:网上也有一种是在xcode中使用shell 脚本,这个也是可以的。引用《在iOS中创建静态库

具体如下:

当前项目下new /Target  并且在Other 地方选择Aggregate



点击next 随便起个名字,不过需要确保 Project 是当前的项目



然后点击项目  选中那个新建的 Aggregate选择右边的 build phases 再点击 + 号 选择 new run script phase  


并且将 这段shell 拷贝进去
# define output folder environment variable 
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal 
  
# Step 1. Build Device and Simulator versions 
xcodebuild -target ImageFilters ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 
xcodebuild -target ImageFilters -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 
  
# make sure the output directory exists 
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" 
  
# Step 2. Create universal binary file using lipo 
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a" 
  
# Last touch. copy the header files. Just for convenience 
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"</span>

代码并不十分复杂,它是这样工作的:
UNIVERSAL_OUTPUTFOLDER 包括了通用二进制包将要被存放的文件夹:“Debug-universal”
Step 1. 第2行执行了xcodebuild并命令它构建ARM架构的二进制文件。(你可以看到这行中的-sdk iphoneos参数)
下一行再次执行了xcodebuild命令并在另一个文件夹中构建了一个针对Inter架构的iPhone模拟器的二进制文件,在这里关键参数是-sdk iphonesimulator -arch i386。(如果感兴趣,你可以在man page了解更多关于xcodebuild的资料)
Step 2. 现在已经有了2个.a文件分别对应两个架构。执行lipo -create,用它们创建出一个通用二进制。 
最后一行的作用是复制头文件到通用构建文件夹的外层。(用cp命令)



然后点击编译
在products 文件夹下的.a文件 右键 点击show in finder 然后会出现新的 文件夹xxx - universal ,里面就是我们想要的结果



以上所有的操作 都是在debug模式下
如果要切换到Release版本 只要切换下编译模式就可以了,其他的操作跟Debug 一样的

三、使用静态库代码模块



新建一个项目并且将文件和静态包拷贝到项目中,并且在项目的Build Settings 中 找到 header search  配置头文件 $SOURCE_ROOT自动展示全部路径
在 build phases 中Link Biinary With Libraries 中点击add other找到该项目的 静态包 并且引入。(我的工具是Xocde7  当我把包拷贝到项目中,是自动引入的)



最后写一点测试代码进行测试咯,然后运行 ,,,就可以看到想要的结果了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值