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就是支持真机和虚拟机的静态文件。
然后就是它的使用了
我们的.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 的方法名要修改。
iOS 封装.framework 以及使用的更多相关文章
- iOS封装功能生成 .framework
前言 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为 ...
- [iOS]封装单例类
[iOS]封装单例类 今天在学习iOS的SQLite开发,发现在需要使用SQLite的每个视图中,都需要对数据库进行打开或关闭,觉得挺麻烦的:于是在想能否写个单例类对这些操作进行封(因以前一直在使用D ...
- iOS 封装SDK以及封装时bundle文件的处理
这篇教程的主要目的是解释怎么样在你的iOS工程中创建并使用一个SDK,俗称.a文件. 环境:xcode 9.0 创建一个静态库工程 打开Xcode,点击File\New\Project, 选择iOS\ ...
- iOS在framework中使用CoreData出现崩溃问题及解决方法
公司项目中有一个功能,保存授权令牌数据.最开始只有一条数据,所以就直接保存在了userdefaults中.后来需要两条数据,还是保存在userdefaults中,其中一条为固定的,另一条不固定可以进行 ...
- IOS 封装功能和逻辑思想
在ios开发中,难免会用到helper的思想.这篇就简单讲解下关于helper的简单实用方法. 假设我们要做一个这样的界面: 会议分为四种情况: 未召开 正在召开 已结束 已取消 再看看逻辑关系: 编 ...
- iOS在线更新framework,使用NSBundle动态读取
官方文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingCode/Tasks/Loadin ...
- iOS Photos.framework框架
链接: iOS8.0 使用Photos.framework对相册的常用操作 iOS AssetsLibrary和Photos的使用总结: 权限及相册的获取 iOS 开发之照片框架详解 iOS Asse ...
- iOS 引入framework的常见问题和原理
今天在引入第三方framework时,我按照以前的方法,把framework加入到了下图的地方: 默认是required的,之后程序就crash了,报错dyld: Library not loaded ...
- iOS 创建framework & bundle 主要配置
bundle:base sdk 为iOS, delete compile resource framework:target dependencies,headers,mach-o proj: tar ...
随机推荐
- win8快捷键
win+Q/S搜索所有位置 win+W搜索设置 win+E文件资源管理器 win+R运行 win+T选中第一个应用程序(不确定) win+U轻松使用设置中心 win+I设置 win+P投影 win+D ...
- 设计模式——职责链模式(C++实现)
#include <iostream> #include <string> using namespace std; class Handler { public: Handl ...
- 数据库学习笔记 4 强大的SQL
其实这篇文章应该至少一个星期前就应该更新了,但是最近小猿我和喜欢了好多年的女神牵手成功,所以这些天有点飘. ---创建表结构 create table tablename ( id int, name ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- 在js中实现新窗口打开页面
我们都知道可以在html代码中使用<a href="xxxx" target="_blank"></a>这种方式来打开一个新的窗口打开一 ...
- 打印二叉堆(Java实现)
打印二叉堆:利用层级关系 我这里是先将堆排序,然后在sort里执行了打印堆的方法printAsTree() public class MaxHeap<T extends Comparable&l ...
- 1-2 hibernate主配置文件hibernate.cfg.xml详解
详 http://www.cnblogs.com/biehongli/p/6531575.html Hibernate的主配置文件hibernate.cfg.xml 1:Hibernate的主配置文件 ...
- Angular开发实践(四):组件之间的交互
在Angular应用开发中,组件可以说是随处可见的.本篇文章将介绍几种常见的组件通讯场景,也就是让两个或多个组件之间交互的方法. 根据数据的传递方向,分为父组件向子组件传递.子组件向父组件传递及通过服 ...
- IMLite轻量级即时通信工具开发指南
花了一周时间开发了一个简单的即时通信工具,勉强算是程序原型.现在我把开发流程和一些个人的想法记录下来.本文首先介绍程序架构和通信接口,之后会聚焦到服务器的信号槽设计原则,接下来将解释有关TCP通信的粘 ...
- python3把txt文件转换为csv文件
#!/usr/bin/python# -*- coding: UTF-8 -*-import csvwith open('file.csv','a',newline='') as csvfile: s ...