Xcode 封装生成静态库

鉴于开发便利及程序共享性,我们需要对自己的项目封装成库,方便别人使用,下面就介绍一下库的基本知识。

一、什么是库?

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

2、静态库形式:.a和.framework。

3、动态库形式:.dylib和.framework。

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

二、静态库与动态库的区别?

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝造成内存资源浪费。

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

三、a与.framework有什么区别?

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

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

3、也就是说如下对等

      .a + .h + sourceFile = .framework。

故对比建议用.framework。

四、为什么要使用静态库?

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

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

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

4 开发第三方sdk的需要。

五、制作静态库时的几点注意:

1、 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h和其它文件,可以直接使用。

2、 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源,使用图片时需要指明 bundle: [UIImage imageNamed:@"xxx.bundle/xxx.png"]。也可以用 Target 方式制作 bundle,使用时和.framework一起拖入工程即可。

3、category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中 为other linker flags添加两个参数 -ObjC -all_load。

4、 如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),把所有需要暴露出来的.h文件都集中放在这个.h文件中后各自隐藏,然后仅将内部创建的这个.h公开即可。

封装a

1、创建Atest工程,选择Cocoa  Touch  Static Library,然后next。

2、创建功能类或者直接将现有类刚刚创建的Atest项目中

3、设置Headers,将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,需要注意的是隐藏的头文件将无法被引用。

步骤23操作

4、分别在真机和模拟器预编译Atest工程(command+b),然后选择libAtest.a-> show in Finder ,将Debug-iphoneos->libAtest.a与Debug-iphonesimulator->libAtest.a 终端命令合并(lipo-create+空格+真机下的libAtest.a+空格+模拟器下的libAtest.a+空格+-output+空格+存放路径)。

show in Finder
.a合并

5、将合并后libAtest.a+TestObj.h导入到工程中,调用暴露方法即可。

用法

封装framework

一、创建工程,选择Cocoa  Touch  Framework,然后next。

创建工程

二、更改xcode配置

在TARGETS下选中工程>Build Setting>搜索

1、将Dead Code Stripping 设置为NO,开启此项会对代码中的”dead”、”unreachable”的代码过滤,为了完整还原framework中的代码,建议关闭。

2、将Link With Standard Libraries 设置为NO,避免重复链接。

3、将Mach-O Type设为Static Library(用户制作的framework只能是静态库)。

配置123

4、选择Architectures配置arm64、armv7、armv7s兼容设备。

兼容设备

备注:(简单介绍一下arm)

arm结构处理器,几乎所有的手机都基于arm,其在嵌入式系统中应用非常广泛。

ARM 处理器因为低功耗和小尺寸而闻名,它的性能在同等功耗的产品中也很出色。这里我们注意一点,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。只有在目标设备上,才会执行设备对应的指令集。

ARMv6设备包括

iPhone, iPhone2, iPhone3G以及第一代和第二代iPod Touc

ARMv7设备包括

iPhone3GS, iPhone4iPad, iPad2, the new ipadiPod touch 3G, iPod touch

ARMv7s设备包括iPhone5,iPhone5S及以上

如果在工程build setting的Architectures中 选“Standard Active Architecture Only”为True则,选择Armv6或v7都只会编译对应指令集的包;若选false,则编译器会整合两个指令集到一起,则包比较大,但是能使用Armv7 的优化,同时能适配到老的机器。一般Debug的时候“Build Active Architecture Only”选择YES,用当前架构看代码逻辑是否有问题,发Release的时候选择NO,因为需要适配其他的机型。低arm的包可以在高arm的机子上跑,反之则不可以。

三、功能类导入

创建功能类或者直接将现有类刚刚创建的项目中,

拖入现成功能类
待封装的功能类

四、功能类实现代码(随意写,只为测试。)

TestObj.h

/**

计算返回值

*/

+ (TestObj *)returnVaule;

TestObj.m

+ (TestObj *)returnVaule {
    static TestObj *obj = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        obj = [[self alloc] init];
    });
    return obj;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        NSInteger a = 10;
        NSInteger b = 20;
        NSLog(@"+++++++%ld++++++",a+b);
    }
    return self;
}

五、设置Headers,将你要公开的头文件拖至Public下,要隐藏的放在Private或者Project下,需要注意的是隐藏的头文件将无法被引用。

Headers配置

六、打包封装

1、分别在真机和模拟器预编译Cocoa  Touch Framework 工程(command+b)。

2、选择testFramework.framework -> show in Finder ,将 Debug-iphoneos->testFramework.framework->testFramework 与Debug-iphonesimulator->testFramework.framework->testFramework终端命令合并(lipo -create+空格+真机下的testFramework+空格+模拟器下的testFramework+空格+-output+空格+存放路径)

终端命令

3、经步骤2的操作会在ee同目录文件下生成ee.lipo文件,将ee.lipo更名为testFramework后替换Debug-iphoneos->testFramework.framework->testFramework而此时Debug-iphoneos目录下的testFramework.framework即是我们最终所需的静态库。

点击桌面qqq文件夹会看到刚刚合并生成的ee.lipo文件

七、库的使用

将testFramework.framework导入到工程中,调用暴露方法即可。

静态库的使用
打印输出
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,460评论 6 538
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,067评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,467评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,468评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,184评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,582评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,616评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,794评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,343评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,096评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,291评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,863评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,513评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,941评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,190评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,026评论 3 396
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,253评论 2 375

推荐阅读更多精彩内容