iOS 开发整理

iOS 静态库Framework、static Library(

2018-05-12  本文已影响17人  流星载梦
开发中常常会使用到别人的lib库文件、Bundle文件以及SDK,感觉用着挺方便的,最主要是提高开发效率。三种文件都属静态库,除了这些还有动态库,不过苹果是禁用,不然是审核不过的,下面就来说说它们的区别。

静态库又分为:framework 与static Library(.a )
内容呈现方式不同:
(1)framework为一站式分享文案,也可以说是一个文件夹,其中包含代码签名,头文件,二进制执行文件,静态资源文件(xib,图片)等。
(2)static Library 就是.a文件,为二进制执行文件。分享给别人的时候,头文件,静态资源文件(xib,图片)需要另外提供,其中xib和图片的提供方式为Bundle。后面会有说明
头文件搜索路径的区别:staticLibrary需要设置头文件搜索路径,framework不需要。
当存在对外部代码依赖的时候:
(1)statciLibrary:使用时只需引用头文件,调用公开的方法,不需要关心库的实现,相当于分离部署。这也就能想通为什么当项目中的类与lib库中的类同名时,会发生代码冲突。
(2)framework:如果需要引用外部库,就必须将此外部库的实现放入framework内编译才可以,相对独立。所以就算项目中包含库中的同一个类,也不会发生冲突。
如果不考虑代码冲突,可以建立staticLibrary,因为这个可以减小包的大小。


一、Static Libary 创建于使用

1.创建Static Libary ,打开Xcode,选择创建Static Libary项目

2.添加自己要制作成静态库的代码文件。 搬砖
3.在Compile Sources下的文件对外不可见,而Copy Files下的文件对外可见 ,即生成外部可见的.h文件和.a文件,可以添加多个 Jietu20180512-155054.jpg
4.设置静态库支持的操作系统 Jietu20180512-155243.jpg

5.运行要导出各种环境下的静态库(真机和模拟机下的Debug/Release库),根据自己的需求。


各种环境下的静态库

6.为了测试方便可合并静态库,当然也可以根据自己的需求导入你需要的静态库
合并静态库方法: lipo -create 需要合并的静态库位置(中间用空格分开) -output 导出位置及合并后的名称;

举例. lipo -create /Users/ssiwo02/Desktop/A/libXXXXX-armv7.a /Users/ssiwo02/Desktop/D/libXXXXXX-x86_64.a /Users/ssiwo02/Desktop/E/libXXXXXX- arm64.a -output /Users/ssiwo02/Desktop/libXXXXX.a

7.测试制作的静态库,创建一个项目,把.a文件头文件导入即可,测试自己的方法能否正常调用及实现。

导入到项目
8、其他进阶使用
在AFN的基础上做一层封装。那么问题来了,这个网络的二次封装是建立在 AFN 的基础上的,如果想将这个二次封装打包,而又不想将 AFN 的代码打进去。
方法:1.同样先建Static Libary 项目.
2.下载AFNetworking,把AFNetworking的文件导入项目中,但Add to target 不要选中, 引入AFNetworking 的头文件,封装代码,如下参考
#import <Foundation/Foundation.h>

@interface myStatic1 : NSObject
+ (void)POST:(NSString *)url params:(NSDictionary *)params success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;
@end
#import "myStatic1.h"
#import "AFNetworking.h"
@implementation myStatic1
+ (void)POST:(NSString *)url params:(NSDictionary *)params success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    // TODO: 1.基本的一些处理
    NSLog(@"添加AFNetworking");
    // TODO: 2.这里用到了 AFN 中的请求方法
}
@end

假装上面就是对 AFN 的二次封装(实际上,可没有这么简单)。仅仅是上面的代码是会出错的。因为用到了 AFN ,但是没有引进 AFN 的代码,不会影响编译生成.a文件。
参考文章:iOS 静态库制作❣


二、Framework为系统方法封装的,可以制作静态库和动态库。制作时可以选择是静态还是动态,默认是动态。

1.创建工程选择Framework。


Framework
2.创建文件即要制作Framework的代码文件 代码文件
3..1在myFramework.h中导入封装的头文件eg.#import "myController.h"
导入头文件
3.2 .设置需要公开的头文件 设置需要公开的头文件

4.设置运行成静态 库还是动态库。

4.1、(动态库)合并Framework文件,导入项目运行测试,如果没有设置的话导出的是动态库,编译没问题,运行时会报错。错误如下:

错误提示
当然也是有解决的办法,在Embedded Binaries 里添加这个库就好了 解决办法
4.2 (静态库)在Build Setting 中找到Mac-o Type选择静态库,然后编译项目就生成了静态文件,如下图: 静态库选择
接下来根据需求合并相关文件导入项目运行就已经完成了。

三、制作Bundle文件

Bundle 是用来存放图片、xib等静态资源文件的,一般与lib库配合使用。
1、使用xcode创建Bundle项目

2、设置支持iOS系统,否则有xib文件的时候,编译不通过 设置支持iOS系统
3、添加图片资源、Xib
资源文件

4、编译生成的Bundle文件
5、把生成的Bundle导入项目中就可以使用了eg.

    //Image使用
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"myBoundle" ofType:@"bundle"];
    NSString *imagePath0 = [[NSBundle bundleWithPath:imagePath] pathForResource:@"sf" ofType:@"png"];
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    [self.view addSubview:imageView];
    imageView.image = [UIImage imageNamed:imagePath0];
    
    //Xib使用
    NSBundle * xibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"myBoundle" ofType:@"bundle"]];
    UIView * view = [[xibBundle loadNibNamed:@"View" owner:self options:nil] objectAtIndex:0];
    [self.view addSubview:view];

运行效果如下:


运行效果
上一篇下一篇

猜你喜欢

热点阅读