开发过程中有时候需要讲一些功能代码封装到静态库文件中,以确保代码的安全性。
主要分为:静态库、动态库两种
静态库和动态库的存在形式
静态库: .a 和 .framework
动态库: .dylib 和 .framework
静态库:链接时,静态库会被完整地复制到可执行文件中, 被多次使用就有多份冗余拷贝
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
需要注意的是:项目中如果使用了自制的动态库,不能被上传到 AppStore
所以基本上就用不到制作动态库文件了,下面来说一说静态库文件,下面以本地framework为例。
静态库文件在编译时,你选择不同的设备时编译出来的framework所支持的环境也会不同,也就是你在制作完framework后,选择的是在模拟器下编译的话,那么你引入到其他工程中,就只能在模拟器下调用执行。如果你选择的是在真机环境下编译的话,那么你引入到其他工程中,只能在真机上调试运行。
选择不同的编译环境,你编译出的framework所支持的环境也不一样,每次在不同的环境下编译后,你可以选中你的framework(注意编译command+B通过后,相应的framework的名字颜色会又红色变为黑色),鼠标右键,Show in Finder,可以对比一下,你会发现在模拟机版本编译后的文件路径在:Debug-iphonesimuator文件夹下。而选择真机版本编译后的文件路径在:Debug-iphonesimuator文件夹下。
so,问题来了,如果想要在真机跟模拟器下都能使用我们自己制作的framework的,要怎么解决这个问题呢?总不能没次更换不同环境下的framework吧(其实不怕麻烦的程序员可以这么整,但作为一个资深强迫症患者程序员来说,太痛苦了,宝宝做不到啊)。
解决上面这个问题的话,就需要我们手动合并我们framework里面的一些文件。
举例:
比如我编译的framework为:ZHWActivity.framework
选择不同环境下的framework,并Show in Finder,会发现在两个ZHWActivity.framework文件夹下面都有一个名为ZHWActivity(你编译的framework的名字)的文件,这个文件在Mac下显示的是一个白板文件。
下面我们就需要将这个两个文件合并成一个ZHWActivity文件:
在桌面新建一个文件夹merge,在merge文件夹下在新建两个文件夹merge1,merge2
讲不同环境下的framework中的ZHWActivity(就是那个白板文件),分别放到这个两个文件夹里。
然后打开终端,cd到merge目录下,执行一下命令:
lipo -create merge1/ZHWActivity merge2/ZHWActivity -output ZHWActivity
(参考:lipo -create “……真机/目录/那个白板文件“ "……/模拟器/目录/那个白板文件" -output “…..另保存的/目录/文件”)
在终端执行完后,会发现在merge目录下,多出来一个ZHWActivity文件(也是一个白板文件),这个就是已经合并后的文件。
将合并后的文件拷贝一份,然后在你导入ZHWActivity.framework工程里,Show in Finder一下。讲工程里原来的ZHWActivity(旧的白板文件),替换成我们合并后的ZHWActivity(新的白板文件,可以看一文件的大小已经是之前旧文件的两倍)。在重新编译一下,你会神奇的发现,在真机跟模拟器下无缝切换,再也不会报错了有木有。
tip1:同理在制作.a静态库文件时,也是区分真机跟模拟器的。也是可以按照上面的方法来合并**.a文件,方便我们开发过程中使用。
tip2:如果我们的制作的静态库文件中有包含的有.mm文件(c++跟oc混编的代码文件),那么我么在其他地方导入时,就需要讲相应的.m文件也改为.mm文件才能正常使用。(如在ViewController.m中引入头文件那么就需要改成ViewController.mm)。
关于静态库文件的制作可以参考下面这篇文章: