iOS 库 开发小结
1.基本用法
定义类,导出头文件,注意头文件,库文件的search path
2.加载资源
- 使用主工程的文件,耦合性太强
- 封装到NSBundle中
NSBundle可以封装xib storyboard assets
对于png文件bundle 对于 不同scale的png文件会默认合并成tiff文件,如果不想这样可以把bundle的build settings里面的 combine_hidpi_images 设置为NO

3.动态 framework
静态库直接链接到程序文件中,动态库就可以分开单独的文件,并且可选择的链接加载,如果不是刚启动就加载可以降低启动时间。
动态库加载方式
链接选项设置 require 或者 option
- 如果没有设置可以用
dlopen的方式动态加载
NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework/Dylib",NSHomeDirectory()];
[self dlopenLoadDylibWithPath:documentsPath];
- (void)dlopenLoadDylibWithPath:(NSString *)path
{
libHandle = NULL;
libHandle = dlopen([path cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);
if (libHandle == NULL) {
char *error = dlerror();
NSLog(@"dlopen error: %s", error);
} else {
NSLog(@"dlopen load framework success.");
}
}
- 使用NSBundle的方式来加载
NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework",NSHomeDirectory()];
[self bundleLoadDylibWithPath:documentsPath];
}
- (void)bundleLoadDylibWithPath:(NSString *)path
{
_libPath = path;
NSError *err = nil;
NSBundle *bundle = [NSBundle bundleWithPath:path];
if ([bundle loadAndReturnError:&err]) {
NSLog(@"bundle load framework success.");
} else {
NSLog(@"bundle load framework err:%@",err);
}
4.链接选项
-all_load 链接所有文件,不管是否会调用里面的符号
-force_load 对指定的库,链接所有文件
-ObjC 如果文件里面有OC代码,就链接这个文件
Perform Single-Object PreLink 这个选项是对库工程设置的,如果启用这个选项,所有的对象文件都会被合并成一个单文件
-whyload 编译日志中会记录那个文件因为什么原因而加载。但是它只会打印第一个被认为是“使用中”的符号。

-dead_strip 这个选项会移除那些虽然和文件一起加载了,但是没有没用的代码和数据。
Dead strip对于C代码能很好的工作(例如:像预期的那样去掉没用的函数、变量和常量),它在C++上也能工作的不错(例如:没用的类能够被移除)。虽然它并不完美,在一些情况下一些符号没有被移除,但是在大多数情况下它能在这些语言下很好地工作。
5.NSBundle 相关
- 根据类名得到 bundle
NSBundle *bundle = [NSBundle bundleForClass:[DemoViewController class]];
- 根据路径得到
NSString *path = [[NSBundle mainBundle] pathForResource:@"xx" ofType:@"framework" inDirectory:@"Frameworks"];
NSBundle *bundle = [NSBundle bundleWithPath:path];
- 多语言
NSBundle* englishBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];
NSString* englishTranslation = [englishBundle localizedStringForKey:translation_key value:@"" table:nil];
en_GB.lproj/
en_US.lproj/
en.lproj/
对于多语言资源的查找,遵循下面的逻辑
- 先查找 语言+地区
- 然后 语言
- 最后 公共
7.相关命令
lipo 用来查询库的编译对应平台,以及整合多个版本的库文件到一个库文件
nm 查询库文件的符号文件
ibtool xib文件编译,国际化文字提取相关命令,可以用来把 xib 文件编译成 nib 文件
$ ibtool --errors --warnings --output-format human-readable-text --compile file.nib file.xib
8.BitCode
BitCode是编译期的feature,而非链接期的feature,也就是编译过程中每个.o文件都会有一个叫做__bitcode的段落生成。
在Build Options中启用BitCode,且使用Build而非Archive编译时,Xcode会自动添加编译选项-fembed-bitcode-marker,这个选项的意思大概就是说:如果BitCode开启的话,这里本来应当是放bitcode的,实际上没放。
在Build Options中启用BitCode,且使用Archive编译时,Xcode会自动添加编译选项-fembed-bitcode,此时才是真正开启了BitCode。
如果编译选项设置-fembed-bitcode-marker,编译成功后上传iTunes Connect,就会出现错误。
如果使用Build编译想强制开启-fembed-bitcode,只需在Target->Build Settings->OTHER_CFLAGS中加入-fembed-bitcode即可。此时Build编译会同时出现两个参数 -fembed-bitcode-marker 和 -fembed-bitcode 。
9.打包
一般网上都是 Aggregate target 方式,但实际上这个只是用来一次编译多个target用的,最终还是要用脚本,既然如此,那不如一步到位直接用脚本解决。我写了一个 脚本 来解决多平台库文件打包问题。
使用方式如下
./package.sh AFrameWorkTarget framework
./package.sh ALIBTarget
参考1.[http://www.galloway.me.uk/tutorials/ios-library-with-resources/]
参考2.[http://www.cocoachina.com/ios/20170401/18989.html]
参考3.[http://stackoverflow.com/questions/12244494/image-resources-for-ios]
参考4.[http://foggry.com/blog/2014/06/12/wwdc2014zhi-iosshi-yong-dong-tai-ku/]
参考5.[http://www.cocoachina.com/ios/20170401/18989.html]
参考6.[http://stackoverflow.com/questions/2567498/objective-c-categories-in-static-library]
参考7.[http://www.jianshu.com/p/fc6b6b43e979]
参考8.[http://stackoverflow.com/questions/31486232/how-do-i-xcodebuild-a-static-library-with-bitcode-enabled]
iOS 库 开发小结的更多相关文章
- iOS线程开发小结
在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSe ...
- iOS项目开发常用功能静态库
YHDeveloperTools iOS项目开发常用功能静态库 查看源码 功能方法: 1.字符检查 [NSString checkStringWithType:Email andTargetStrin ...
- 谈一谈做iOS播放器库开发所涉及的知识点
在自己研究生毕业的时候,想着能找上一份做视频编解码的工作,可惜没有如愿,最后到了一家iOS游戏渠道公司去做游戏支付业务的SDK开发,我的iOS正式开发生涯就这么开始了. 在那家iOS游戏渠道没做上一年 ...
- iOS应用开发最佳实践
<iOS应用开发最佳实践> 基本信息 作者: 王浩 出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...
- pdfjs viewer 开发小结
此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...
- iOS常用开发资源整理
在行--专家付费咨询 杂项 App Release Checklist—iOS App发布清单. Hey Focus—帮助你专注于一个任务. Objective Cloud—Objective C A ...
- 教你写能被舒服舒服又舒服地调用的iOS库
目录 前言 脑洞开一开 分析 整容 结语 前言 2014年过的那么快,过年又那么块,2015年又是飞快地节奏,真尼玛感觉上帝是不是无聊使用了变速外挂开启了加速模式~到现在博主都无法接受已经上班的事实… ...
- iOS企业级开发初级课程-表视图(13集)
首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...
- Search Ads 已经在美国区上线 - iOS 移动开发周报(46)
Search Ads 已经在美国区上线 - iOS 移动开发周报(46) 新闻 Search Ads 上线 苹果的 AppStore 搜索广告终于 正式上线了 https://developer.ap ...
随机推荐
- 阅读Configuration源码
一.阅读类注释 ①.Configuration的实例允许应用程序使用指定的属性映射文件来创建一个SessionFactory. ②.通常在一个应用程序中创建一个单一的Configuration对象,· ...
- 内存修改之IOS版ce
开源工具,算法全部在内存中完成,速度比bmsq,igg快,直接搜索0也是无压力.使用c++编写,有一定的扩展能力,可以自己扩展value type和comparator. 项目地址: https:// ...
- java 中重载(Overload)和重写(Override)的区别
首先重载和重写是应用于两个不同场景下面的两种不同的手段: 两者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不 ...
- POJ 1753 Flip Game (状态压缩 bfs+位运算)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- Css中路径data:image/png;base64的用法详解 (转载)
大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: background-image:url(data:image/png;base64, iVBORw0KGg ...
- 如何不使用 submit 按钮来提交表单?
如果我们不想用 submit 按钮来提交表单,我们也可以用超链接来提交,我们可以这样写代码: <a href=”javascript: document.myform.submit ();” ...
- Maven常用的构建命令
1.mvn -v 查看maven版本 2.mvn compile 编译项目,生成target文件夹,其中包含编译生成的字节码文件和测试报告.打开cmd,cd到项目的根目录,运行该命令如图所示(如果是第 ...
- 【Linux资源管理】一款优秀的linux监控工具——nmon
(一)nmon工具概述 nmon是以一个用来做linux服务器监控的工具,通过nmon,可以实现对以下参数的监控: --CPU使用率 --内存.交换空间使用率 --网络使用情况 --磁盘I/O,读写速 ...
- wamp 的配置
一 . 安装 二 . 配置 安装过后打开E:\wamp2\wamp\bin\apache\Apache2.2.21\conf\httpd.conf 寻找Directoy 为文件路径 里面的默认文件删 ...
- Vue——关于css过渡和动画那些事
1. 单元素/组件的过渡transition Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 条件渲染 (使用 v-if) 条件展示 (使用 v ...