美文网首页
静态库与动态库

静态库与动态库

作者: 一条鱼的星辰大海 | 来源:发表于2019-06-24 17:25 被阅读0次

在iOS中,库分为静态库和动态库,它是程序代码共享的方式。

iOS静态库的形式:.a 和 .framework

iOS动态库的形式:.dylib 和 .framework

静态库与动态库的区别:

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在。

静态 库在程序编译时会被链接到代码中,程序运行时将不再需要改静态库,而动态库在编 译时不会被链接到代码中,只有程序运⾏时才会被载入,所以 hook 别⼈程序或者说 做插件都是运⽤用了了 runtime 机制,然后动态库注⼊入修改的。

.a与.framework有什么区别:

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

.a文件不能直接私用,必须还要有.h文件配合,.framework文件可以直接使用

.a文件+.h文件+资源文件 等同于 .framework文件


制作 .a ⽂文件时候,要注意 CPU 架构的⽀支持,i386、X86_64、 armv7、armv7s。 查看可以通过命令 “ lipo -info 静态库名称” 。模拟器器 .a ⽂文件和真机 .a ⽂文件合并可 以通过 "lipo -create 模拟器器静态库1名 真机静态库2名 -output 新静态库名称" 一些坑

命名不要太随意,毕竟是被别人拿过去⽤用的要能看懂。 framework中⽤用到了了NSClassFromString,但是转换出来的class ⼀一直为nil。解决⽅法:在主工程的【Other Linker Flags】需要添加参数【-ObjC]即可。 如果Xcode找不不到框架的头⽂文件,你可能是忘记将它们声明为public了了。 解决方法: 进⼊入target的Build Phases⻚页,展开Copy Headers项,把需要public的头⽂文件从 Project或Private部分拖拽到Public部分。

尽量不要用xib 。由于静态框架采⽤用静态链接,linker会剔除所有它认为⽆用的代码。 不幸的是,linker不会检查xib文件,因此如果类是在xib中引用,⽽而没有在OC代码中引用,linker将从最终的可执⾏文件中删除类。这是linker的问题,不是框架的问题 (当你编译一个静态库时也会发生这个问题)。苹果内置框架不会发生这个问题,因 为他们是运行时动态加载的,存在于iOS设备固件中的动态库是不可能被删除的。 有两个解决的办法:

1、 让框架的最终⽤用户关闭linker的优化选项,通过在他们的项目的Other Linker Flags中添加-ObjC和-all_load。

2、 在框架的另一个类中加一个该类的代码引用。例如,假设你有个MyTextField类, 被linker剔除了。假设你还有一个MyViewController,它在xib中使⽤了 MyTextField,MyViewController并没有被剔除。你应该这样做: 在MyTextField中:

+(void)forceLinkerLoad_ {}

在MyViewController中:

+(void)initialize {[MyTextField forceLinkerLoad_];}

他们仍然需要添加-ObjC到linker设置,但不需要强制all_load了。 第2种方法需要你多做一点工作,但却让最终⽤户避免在使用你的框架时关闭linker优 化(关闭linker优化会导致object文件膨胀)。

相关文章

网友评论

      本文标题:静态库与动态库

      本文链接:https://www.haomeiwen.com/subject/tuknuqtx.html