iOS 封装.framework 以及使用

.framework是什么?


      .framework是什么?

      这个问题相信做iOS的都知道答案。 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝、微信SDK等等中的库,这些库可以给我们的开发带来很大的便利。有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用。在这里就边参考好点的博客,边总结一下我们经常看到的.framework。

      那什么是“库”呢?

      “库”是共享程序代码的一种方式!同行总结的这句话很简单也很好的说明了它的作用!

      一般的分为“静态库”和“动态库”。

“静态库”和“动态库”有什么区别?


      “静态库”  链接时候完整的拷贝至可执行文件中,被多次使用就会有多次拷贝。

      “动态库”  链接时候不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存!

iOS里静态和动态库形式


      静态库形式: .a和.framework

      动态库形式: .dylib和.framework

.a与.framework有什么区别


      .a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。       .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。       .a + .h + sourceFile = .framework。        所以我们建议用.framework.

下面我们通过实际的例子自己制作一下


       我们首先得创建这个FrameWork,按照下图:

      我们创建了这个FrameWork,看看这个 FrameWork的结构:

      我们再里面简单的添加了一个ShowNSlog的类,并且我们添加了一个 FrameWorkTest.boundle文件,看看我们在这个类里面写了什么内容:

#import "ShowNSLog.h"

@implementation ShowNSLog

+(void)showLog{
        
        NSLog(@"你使用了我们的静态库");
}

+(NSString *)showLogWithReturn{
        
        return @"zhouzhou.jpg";
}

@end

      接下来对我们的这个.framework静态库进行一些简单的设置,如下图所示:

      1、首先是Dead Code Stripping设置为NO,网上对此项的解释如下,大致意思是如果开启此项就会对代码中的”dead”、”unreachable”的代码过滤,不过这个开关是否关闭,似乎没有多大影响,不过为了完整还原framework中的代码,将此项关闭也未曾不可。

      2、然后将Link With Standard Libraries关闭,我想可能是为了避免重复链接

      3、最后将Mach-O Type设为Static Library,framework可以是动态库也可以是静态库,对于系统的framework是动态库,而用户制作的framework只能是静态库。

      接下里就是设置我们有那些头文件是需要公开的,如下图设置:

      还要记得把要公开的类添加到我们的FrameWorkTest.h中,比如下面是我们例子中的:

#import <UIKit/UIKit.h>

//! Project version number for FrameWorkTest.
FOUNDATION_EXPORT double FrameWorkTestVersionNumber;

//! Project version string for FrameWorkTest.
FOUNDATION_EXPORT const unsigned char FrameWorkTestVersionString[];

// In this header, you should import all the public headers of your framework using statements like #import <FrameWorkTest/PublicHeader.h>

// 导入要公开的头文件
#import <FrameWorkTest/ShowNSLog.h>

      最后要做的就是打包制作我们这个FrameWork了:

      command+B 按照我们下图的选择,打包出这个FrameWork:

      这个时候你就会看到FrameWork项目里的Products文件多了我们的.framework文件。你Show in Finder一下就会看到下面这样的两个文件夹了,一个就是真机一个就是模拟机的:

      接下来就是生成我们.framework文件的最后一步了:利用终端把模拟机和真机的文件我们合并成一份:

      把上图中我们标注的FrameWorkTest文件进行下面的操作:

      在终端中输入命令:lipo -create  模拟机和真机的FrameWorkTest文件路径(直接拉到终端就会显示)-output 一个输出路径  

      具体的例子我们看下面我们终端中的信息:

      注意:随后生成的可以看到是一个.lipo文件,这时候你需要做的就是改了它的名称(包括去掉后缀)然后去随便覆盖你的真机或者模拟机的之前我们合并时候的文件!

然后就是它的使用了


      我们的.framework文件就算是制作完成了,那使用我相信大家也都知道,把它拉到我们的项目中,我们看看我们的使用情况,证明我们的是OK的:

      顺便这里说一下.boundle文件的制作,新建一个文件,把它后缀名改为.boundle文件,这时候你要是直接打开这个文件的不行的,那就“显示包内容”给里面添加资源文件就可以!

      我们再看我们的项目中我们拉进来的文件:

      我们在我们的.boundle文件中添加了一张图片,我们再具体看看这个图片的使用以及我们这个.framework静态库是不是能成功使用:

      一:导入我们的静态库:

      二:具体的使用:

      三:看看我们的打印日志:

      上面的哪张我们使用的图片也是能够正常出现的,我们这里就不再截图发了,有兴趣的可以自己试试。

最后需要总结的:


       1、在制作framework或者lib的时候,如果使用了category,则使用改FMWK的程序运行时会crash,此时需要在该工程中 other linker flags添加两个参数 -ObjC -all_load。(这点没有亲测)

       2、带有图片资源的需要把图片打包成Bundle文件,和framework一起拷贝到相应的项目中。

       3、公开的类中如果引用的private的类,打包以后对外会报错,找不到那个private的类,可以把那个private的.h放到(也没亲测)

       4、namespace 冲突。静态库用了某第三方库,项目也用了同样的第三方库,在编译的时候就会有 duplicate symbol 错误,因为有两份同样的第三方库。解决办法就是把用到的第三方库加上自定义前缀,包括类名、delegate 协议、常量名,尤其需要注意 Category 的方法名要修改。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

一款 windows 英文面板-Winginx 安装和配置过程

当下 windows 服务器的使用数量还是不少的,为了在网站上线之前测试程序可用性,很多人会在本地 windows 系统中安装使用 windows 面板来搭建 ...

1622
来自专栏潇涧技术专栏

React Native Upgrade

文中的代码和图片我都反复检查过了,基本上没有泄露公司的重要信息的数据,如若发现有泄露的话请立即告知我 ;-)

1262
来自专栏SpringBoot 核心技术

第一章:用一个HelloWord来阐述SpringBoot的简单与快速简介 本章目的系统要求开始构建项目项目目录结构初尝试运行项目编写HelloWordController总结

1342
来自专栏散尽浮华

Linux下快速迁移海量文件的操作记录

有这么一种迁移海量文件的运维场景:由于现有网站服务器配置不够,需要做网站迁移(就是迁移到另一台高配置服务器上跑着),站点目录下有海量的小文件,大概100G左右,...

3167
来自专栏PHP技术大全

grafana+ prometheus+php 监控系统实践

团队在开发流媒体服务,需要实现一个监控在线人数的功能,可以看到历史有多少人在线,当前有多少人在线的功能。 如果用mysql等关系型数据库来实现,可以用事件记录日...

3003
来自专栏云计算教程系列

在Ubuntu 16.04上安装OpenVAS 8

OpenVAS(开放式漏洞评估系统)是一个客户端/服务器架构,它常用来评估目标主机上的漏洞。OpenVAS是Nessus项目的一个分支,它提供的产品是完全地免费...

2332
来自专栏岑志军的专栏

fastlane实现自动化打包

2052
来自专栏小文博客

Vultr忘记密码找回及重置方式

6295
来自专栏Youngxj

YoungxjTools开源工具箱

答:项目本身支持站内站外跳转,添加新的工具箱,你只需要在网站根目录创建一个文件夹,在文件夹内部就是你的工具箱,只需要在头部插入

1K26
来自专栏Timhbw博客

防止WordPress后台被暴力破解

2017-04-0613:34:01 发表评论 955℃热度 WordPress作为使用人数最多的博客系统,一直是大家关注的焦点,不安好心的人找漏洞,钻空子爆...

5246

扫码关注云+社区

领取腾讯云代金券