iOS--关于静态库和动态库的一些讨论记录

今天同事遇到了一个动态库的问题,大家讨论了很久。很尴尬啊 遇到好多知识盲区啊 兄dei 默默的拿出我的小本本记录一下。

决定应用性能的最重要的因素包括2点
1.启动时间
2.运行内存中占用
尽可能减少可执行文件的大小和使用内存

大部分时间动态库都是优于静态库的

静态库

现在打成静态库的情况越来越少了。
都是用framework形式搞得
只要在设置的地方改成


image.png

image.png

当我们库文件打包生成 静态链接器,当主程序编译的时候,静态库会加载到主程序的源文件中。

但这里 静态库优于动态库的地方, 打出来ipa包 一般来说会小于动态库的。 因为主程序中相关的类会编译加载到主程序。不相关的不会加载。


categoty并不会加载。 要加载category 就要在Other Linker Flags中加入-ObjC来提示加入类目。如果只有类目的话,还是会加载不出来就要使用-all_load加载全部,或者-force_load强制加载某一个。

动态库

image.png

和静态库的对比可以看出 最大的区别就是。
1 加载到可执行程序的是动态库的引用

在程序运行的时候,动态库会放在进程的内存地址中。
这样运行的时候,可执行程序的内存就会大大减小。

不过对于静态库的ipa包。动态库是全量放在ipa包中的。可能ipa包会大一点。

还要一个很重要的点,就是加载时间。
动态库不仅仅是在启动的时候加载。可以选择运行时加载。可以减少内存使用和启动时间。

引发讨论的问题

动态库在主程序打包的时候出现了error: Bundle only contains bitcode-marker
但是在模拟器build的时候没有问题

引发这个问题的原因是bitcode
1 Xcode在自己build的时候时候会使用-fembed-bitcode-markerMode
2 在archive build和production build的时候需要使用-fembed-bitcode

我用通过run build生成的动态包都是使用-fembed-bitcode-marker 在打包的时候,明显不对。

image.png

解决方案:
1 'Other C Flags' to "-fembed-bitcode"
2 Build Settings + user-defined build setting BITCODE_GENERATION_MODE, Debug to marker, Release to bitcode

3 或者禁用bitcode

一些额外的命令

//查看信息
lipo -info xxx.framework/xxx 
// 合并库
lipo -create -output xxx xxx
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1我是无聊的人。 没事做的时候就喜欢做实验。 我发现,人的右手被截后无法接回。 不过不用担心,因为可以接别人的。 ...
    我叫马康阅读 270评论 0 0
  • 2组-雷斯棋 20171027 心得打卡 21.那又是什么能影响到褪黑素的分泌呢? 有很多,但最直接的因素有两个...
    2013sun阅读 273评论 0 0
  • 程序流(程序的结构) //1,顺序结构 //2,分支结构 //if if.......else if.......
    答泡浴阅读 246评论 0 0

友情链接更多精彩内容