iOS 封装生产 .framework(一)

1、库?

库是共享代码的方式,一般分为动态库和静态库。

 

2、静态库和动态库的区别?

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

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

 

3、iOS里静态库的形式

.a 和 .framework

 

4、iOS里动态库的形式

.dylib 和 .framework

 

5、framework为什么既是静态库又是动态库?

系统的.framework是动态库,我们自己建立的.framework是静态库。

 

6、.a 和.framework有什么区别?

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

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

.a + .h + sourceFile = .framework

建议使用.framework

 

7、为什么使用静态库?

*方便共享代码,便于合理使用

*实现iOS程序的模块化。可以把固定的业务模块化成静态库。

*和别人分享你的代码库,但不想让别人看你的代码实现。

*开发第三方SDK的需要。

 

8、制作静态库几点注意

*图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundel文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容就可以向其中添加图片资源。

*category是我们实际开发中经常用到的,把category打成静态库是没有问题,但是在用这个静态库的工程中,调用category中的方法时会出现找不到该方法的运行时错误,解决办法是:在使用静态库的工程中配置other linker flags的值为-Objc。

*如果一个静态库很复杂,需要暴露的.h比较多,就可以在静态库的内部新建一个.h文件(一般这个.h文件的文件名字和静态库的名字相同),然后把所有需要暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以。

 

封装framework步骤:

1、打卡xcode新建工程,选择Framework&Library --> Framework,然后点next

iOS 封装生产 .framework(一)_第1张图片 标题

 

2、创建功能类或者拖入已有的功能类

iOS 封装生产 .framework(一)_第2张图片 标题

3、实现功能类的功能

.h 文件中

@interface ShowResult : NSObject

 

+ (void)show;

 

@end

.m文件中

#import "ShowResult.h"

 

@implementation ShowResult

 

+ (void)show

{

    NSLog(@"hello world !!!");

}

@end

4、更改xcode项目配置

在TARGETS下选中工程>Build Setting>搜索linking,然后几个需要设置的选项都显现出来。

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

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

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

iOS 封装生产 .framework(一)_第3张图片

​​​​​​

5、增加armv7s

iOS 封装生产 .framework(一)_第4张图片 标题

 

6、设置headers

将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,当然,隐藏的头文件就无法再被引用。

iOS 封装生产 .framework(一)_第5张图片 标题

然后需要在FrameworkTest.h(必须是公开的,否则无法引用)中将你所有要公开的.h引入。

iOS 封装生产 .framework(一)_第6张图片 标题

7、打包

打包方式有两种,一种是手动打包,另一种是脚本打包,这里我们用手动打包。

a/ 选中模拟器,编译程序command + B

b/ 选中测试机,编译程序command + B 

c/ 在finder中找到framework文件

iOS 封装生产 .framework(一)_第7张图片 标题

一个是Debug-iphoneos(真机)下的,一个是Debug-iphonesimulator(模拟器)下的。

8、通过终端命令将两个framework合为一个模拟器和真机都可使用的framework。

iOS 封装生产 .framework(一)_第8张图片 标题

打开终端,输入

使用命令行 lipo -info 查看framework架构信息 真机版本。

如上图1区;

模拟器版本。

如上图2区;

合并真机模拟器版本 因为以上获取的framework只能在对应的版本上运行(即真机只能在设备上运行模拟器版本只能在模拟器上面运行使用)所以需要合并为通用版本 命令行语句:sudo lipo -create (此处请填写真机FrameworkTest文件路径) (此处填写模拟器FrameworkTest文件路径) -output  自定义合成文件存储路径(合成文件的名字FrameworkTest)。

如上图3区;

根据以上命令就在相应位置生成了新的FrameworkTest文件,然后把这个新生成的文件拷贝到相应的framework中进行FrameworkTest文件替换。

 

查看替换后的framework支持全部真机模拟器架构;

如上图4区;

9、制作好的framework集成使用 把制作好的framework拖入到工程中,引用相关头文件,然后初始化进行暴露方法调用。

iOS 封装生产 .framework(一)_第9张图片 标题

 

 

你可能感兴趣的:(关键方法,技巧)