iOS静态库简单使用与开发
一:介绍
1.什么是库?
库是共享程序代码的方式,一般分为静态库和动态库。
静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
2.两种形式中.framework的区别
如上图所示,静态库的形式包含.a和.framework两种形式,动态库的形式包含.dylib和.framework。
静态库和动态库都有.framework,但是各有所指,系统的.framework是动态库,我们自己建立的.framework是静态库。
3.静态库中.a与.framework的区别
.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。 .a文件不能直接使用,至少还有.h文件配合,.framework文件可以直接使用,因为本身包含了h文件和其他文件
4.静态库的优点
实现程序的模块化,将固定的业务模块化成静态库。
方便共享代码,即可以和别人分享你的代码库,但别人又看不到你代码的实现。
开发第三方sdk的需要,例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。
公司项目需要开发出一套同时支持微信支付、支付宝支付、银联支付的sdk,既要满足本公司项目需求,还需要提供给友方公司使用。
同时集成三家第三方的支付sdk,其中有大量的配置冲突需要解决。这篇文章通过demo和大家介绍一下如何开发自己的静态库.a文件,分享给大家,同时对工作进行总结。
二:静态库的实现
Xcode 9.2
macOS High Sierra 10.13.2
1.新建一个静态库工程
工程命名YYSDK,如下图:
2.导入头文件
导入需要的头文件。导入
#import <UIKit/UIKit.h>
添加配置,如图:
如果不结合头文件,静态库是没有用的,静态库编译一组文件,在这些文件中类和方法都以二进制数据的形式存在。
在静态库中类分为两类,一类是公开的public,一类是私有的只能内部访问使用。
接下来,需要在build栏中添加新的phase,来包含所有头文件。
在Xcode的Build Phases界面,选择Editor\Add Build Phase\Add Headers Build Phase。
注意:如果发现按上面找到的菜单项是不可点击的,点击下方Build Phases界面的白色区域来获取Xcode的应用焦点,然后重新试一下。
把YYSDK.h从项目中拖到Copy Headers下的Public部分。 这里是要保证用户可以使用库中公开的类或者接口。
Copy Headers下的Public部分中所添加的类均是对外公开的。 这里有三个分组,Public公开的,Private下的头文件是可以被用户看到的,Project下的文件是私有的,这里建议尽量将文件放在Public和Project下。
3.添加配置
添加配置主要是在Build Settings下操作,点击项目名,然后选择YYSDK静态库目标,选择Build Setting栏,然后搜索public header,双击Public Headers Folder Path,在弹出视图中键入如下内容:
include/$(PROJECT_NAME)
因为你创建好的静态文件供他人使用,最好禁掉无效代码和debug符号,让用户自己选择对自己的项目有利的部分使用。
在搜索框中分别搜索Dead Code Stripping、Strip Debug Symbol During Copy、Strip Style配置如下:
Dead Code Stripping设置为NO
Strip Debug Symbol During Copy 全部设置为NO
Strip Style设置为Non-Global Symbols
到目前为止,项目的构建已经完成,选择目标为Generic iOS Device,按下command + B进行编译,工程导航栏中Product目录下libYYSDK.a文件将从红色变为黑色,表明现在该文件已经存在了。右键单击libYYSDK.a,选择Show in Finder,如下图所示:
上图就可以看到对外公开的YYSDK.h类,其他实现类均以二进制的形式在libYYSDK.a中。
4.功能实现
这里以实现静态库的开发为主,功能部分实现一个简单的功能demo来举例。
在头文件YYSDK.h中实现如下代码:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>@interface YYSDK : NSObject/**设置label AttributedText 字体, 行间距, 字间距, 段间距 @param string label上文字
@param lineBreakMode 每行容纳字符的宽度
@param alignment 对齐方式
@param font 字体大小
@param lineSpace 行间距
@param textlengthSpace 字间距
@param paragraphSpacing 段间距
@return 存放属性的字典*/
+ (NSDictionary *)setTextLineSpaceWithString:(NSString *)stringwithLineBreakMode:(NSLineBreakMode)lineBreakModewithAlignment:(NSTextAlignment)alignmentwithFont:(UIFont *)fontwithLineSpace:(CGFloat)lineSpacewithTextlengthSpace:(NSNumber *)textlengthSpaceandParagraphSpaceing:(CGFloat)paragraphSpacing;/**计算label AttributedText 高度 @param string label展示的文字
@param textSize label的size,高度设置为0
@param lineBreakMode 每行容纳字符的宽度
@param alignment 对齐方式
@param font 字体描述
@param lineSpace 行间距
@param textlengthSpace 字间距
@param paragraphSpacing 段间距
@return 计算出来的高度*/
+ (CGFloat)getSpaceLabelHeight:(NSString *)stringtextSize:(CGSize)textSizewithLineBreakMode:(NSLineBreakMode)lineBreakModewithAlignment:(NSTextAlignment)alignmentwithFont:(UIFont *)fontwithLineSpace:(CGFloat)lineSpacewithTextlengthSpace:(NSNumber *)textlengthSpaceandParagraphSpaceing:(CGFloat)paragraphSpacing;@end
在实现文件YYSDK.m中实现代码。
选择目标为Generic iOS Device,按下command + B进行编译。
5.合并静态库
选择目标为Generic iOS Device,编译运行后,右键单击libYYSDK.a,选择Show in Finder显示的libYYSDK.a可在真机,如果在虚拟机中运行会报错。
所以还要选择目标为虚拟机(例如iPhone 8),然后编译运行,右键单击libYYSDK.a,选择Show in Finder显示的libYYSDK.a可在虚拟机中运行,如果在真机中运行会报错。
合并方法:打开终端,输入 lipo -create 真机库.a的路径 模拟器库.a的路径 -output 合成库的名字(可以复制模库.a的路径,修改名字).a;回车就可以在模拟库的文件夹中看到新合成的.a文件了,如下图:
YYSDK.a文件即为静态库文件,一个通用的静态库.a就做好了。
三:静态库的使用
1.导入静态库
导入静态库和.h头文件,注意下图选项:
2.上代码
NSString *text = @"突然想要写点什么,来纪念自己即将逝去的大学四年时光,借机过度一下自己此时此刻莫可名状的心情;\n突然想要说点什么,来缅怀一下自己当初万丈豪情遗失的时光和所谓的青春年华。\n不知道是骨子里的性情使然,\n还是内心深处想要特意地煽情?";UIFont *font = [UIFont systemFontOfSize:18.f];CGFloat lineSpace = 5.f;CGFloat paragraphSpacing = 10.f;CGSize labelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - 20, 0);NSNumber *textLengthSpace = @1.5;NSDictionary *dict = [YYSDK setTextLineSpaceWithString:text withLineBreakMode:(NSLineBreakByCharWrapping) withAlignment:NSTextAlignmentLeft withFont:font withLineSpace:lineSpace withTextlengthSpace:textLengthSpace andParagraphSpaceing:paragraphSpacing];CGFloat height = [YYSDK getSpaceLabelHeight:text textSize:labelSize withLineBreakMode:(NSLineBreakByCharWrapping) withAlignment:(NSTextAlignmentLeft) withFont:font withLineSpace:lineSpace withTextlengthSpace:textLengthSpace andParagraphSpaceing:paragraphSpacing];UILabel *label = [[UILabel alloc] init];label.numberOfLines = 0;
// label.backgroundColor = [UIColor yellowColor];label.textColor = [UIColor grayColor];label.frame = CGRectMake(10, 50, labelSize.width, height);label.attributedText = [[NSMutableAttributedString alloc] initWithString:text attributes:dict];[self.view addSubview:label];
效果如下:
Tips:
如果出现错误,Linker command failed with exit code 1(use -v to see invocation)
原因是你导入错误的编译版本。
以上错误,是你的库文件(.a)为真机版本,你却用模拟器来调试程序。将调试目标换成真机,或者使用合并之后的(.a)文件也可以解决。
操作时会遇到很多问题,具体问题具体对待。
静态库Demo下载地址,包含.a的制作文件和使用文件,(可以修改label的行间距,字间距)。
iOS静态库简单使用与开发相关推荐
- ios开发 c语言打包.a文件,【转】IOS静态库a文件制作流程
原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 " ...
- ios 静态库合成_iOS : 静态库(.framework)合并
如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的. 此时可以通过配置一个Run Script,在Script中使 ...
- ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序
ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...
- ios 静态库冲突的解决办法
参考:http://www.cnblogs.com/machao/p/5288460.html ios 静态库冲突的解决办法 最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的 ...
- iOS静态库和动态库
iOS静态库和动态库 静态库和动态库是什么,以及它们的区别,详细介绍可参考博文:iOS里的动态库和静态库,里面讲的很详细. 静态库动态库的区别 内容来源自:iOS动态库与静态库 静态库和动态库是相对编 ...
- 编译-C++支持iOS静态库的脚本学习
这是一个编译C++库,支持iOS静态库的一个脚本.仅供研究学习的. #!/bin/bashPLATFORMPATH="/Applications/Xcode.app/Contents/Dev ...
- iOS静态库.a文件制作和导入使用
iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...
- ios 静态库合成_iOS链接原理解析与应用实践
在iOS App开发中,程序的链接是由Xcode中自带的LLVM来帮助我们完成的,程序员们也因此更注重业务逻辑的编写.但其实了解链接的原理能让我们对iOS的底层有更深层次的认识,也有助于我们从底层原理 ...
- iOS 静态库制作,Framework制作,Bundle制作
在上一篇教程(中译版)中,你学到了怎么样创建一个可复用的圆形旋钮控件.然而你可能不清楚怎样让其他开发者更方便地去复用它. 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法 ...
最新文章
- DCMTK:CT位置FG类测试
- Elasticsearch线程池介绍
- (转)漫画:什么是分布式事务?
- java计算程序执行时间_java计算程序执行所用时间例子
- Uber七折流血融资,软银拿下15%股份,滴滴笑了
- 从分析***方式来谈如何防御DDoS***
- 嵌入式开发板RS485协议串口编程——角度传感器数据读取
- **容易混淆的4中park变换**(转载)
- 约当标准型_特征向量到约当标准型
- 台式计算机总是重启,台式电脑总是自动重启,查不出问题!
- 计算机的桌面偏上怎么调整,电脑桌面软件太靠边怎么办
- GTD时间管理工具Omnifocus 3 Mac中文版
- 时尚新享受,告别鼠标手
- PTA(C++):L1-2 大笨钟(10分)[简单if判断]
- 第 13 周 / 编程题 - 新兵队列训练(选做)
- 嵌入式论文分析:Energy-Efficient and Robust Middleware Prototyping for Smart Mobile Computing
- mysql 日志 博客,Frank的博客
- 电路图部分原件的画法
- 【博学谷学习记录】超强总结,用心分享|大数据之Presto
- 最新版抖音(20200624)去水印原理及源码,简单的原理与面临的挑战