一:介绍


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静态库简单使用与开发相关推荐

  1. ios开发 c语言打包.a文件,【转】IOS静态库a文件制作流程

    原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 " ...

  2. ios 静态库合成_iOS : 静态库(.framework)合并

    如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的. 此时可以通过配置一个Run Script,在Script中使 ...

  3. ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序

    ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...

  4. ios 静态库冲突的解决办法

    参考:http://www.cnblogs.com/machao/p/5288460.html ios 静态库冲突的解决办法 最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的 ...

  5. iOS静态库和动态库

    iOS静态库和动态库 静态库和动态库是什么,以及它们的区别,详细介绍可参考博文:iOS里的动态库和静态库,里面讲的很详细. 静态库动态库的区别 内容来源自:iOS动态库与静态库 静态库和动态库是相对编 ...

  6. 编译-C++支持iOS静态库的脚本学习

    这是一个编译C++库,支持iOS静态库的一个脚本.仅供研究学习的. #!/bin/bashPLATFORMPATH="/Applications/Xcode.app/Contents/Dev ...

  7. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

  8. ios 静态库合成_iOS链接原理解析与应用实践

    在iOS App开发中,程序的链接是由Xcode中自带的LLVM来帮助我们完成的,程序员们也因此更注重业务逻辑的编写.但其实了解链接的原理能让我们对iOS的底层有更深层次的认识,也有助于我们从底层原理 ...

  9. iOS 静态库制作,Framework制作,Bundle制作

    在上一篇教程(中译版)中,你学到了怎么样创建一个可复用的圆形旋钮控件.然而你可能不清楚怎样让其他开发者更方便地去复用它. 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法 ...

最新文章

  1. DCMTK:CT位置FG类测试
  2. Elasticsearch线程池介绍
  3. (转)漫画:什么是分布式事务?
  4. java计算程序执行时间_java计算程序执行所用时间例子
  5. Uber七折流血融资,软银拿下15%股份,滴滴笑了
  6. 从分析***方式来谈如何防御DDoS***
  7. 嵌入式开发板RS485协议串口编程——角度传感器数据读取
  8. **容易混淆的4中park变换**(转载)
  9. 约当标准型_特征向量到约当标准型
  10. 台式计算机总是重启,台式电脑总是自动重启,查不出问题!
  11. 计算机的桌面偏上怎么调整,电脑桌面软件太靠边怎么办
  12. GTD时间管理工具Omnifocus 3 Mac中文版
  13. 时尚新享受,告别鼠标手
  14. PTA(C++):L1-2 大笨钟(10分)[简单if判断]
  15. 第 13 周 / 编程题 - 新兵队列训练(选做)
  16. 嵌入式论文分析:Energy-Efficient and Robust Middleware Prototyping for Smart Mobile Computing
  17. mysql 日志 博客,Frank的博客
  18. 电路图部分原件的画法
  19. 【博学谷学习记录】超强总结,用心分享|大数据之Presto
  20. 最新版抖音(20200624)去水印原理及源码,简单的原理与面临的挑战

热门文章

  1. Android判断是否飞行模式已经监听飞行模式
  2. 利用MS-SAMR协议修改用户密码
  3. 【大型讲座】一带一路全球布局 - 大国崛起的战略性项目管理
  4. javascript控制元素隐藏的方法
  5. 【情书加密】,Python花式表白,这样泡小师妹,没跑了
  6. 局域网共享打印机另类方法IIS共享打印机
  7. ERP解决方案提供商法里达巴德
  8. Scratch少儿编程案例-坦克大战-多武器-多关卡-多Boss
  9. 让koala 编译scss支持中文注释
  10. 短语,直接短语,句柄、最左素短语