1>静态库与动态库的基本区别
1)静态库会有多份内存拷贝,比如应用A和应用B都用到test.framework静态库,他们运行时会拷贝自己的静态库文件,
2)而动态库只有一份,比如原生的UIKit,多个应用用到UIKit时只有一份内存拷贝,也就是动态共享缓存.
静态库的作用:
1.不想让你看到核心代码,但是又想你使用它的代码,所以打包成SDK
2.框架代码,改动比较少,不允许无关的人乱改动,打包成静态库运行更快,因为静态库是编译过的
3.核心人员掌握静态库,避免普通职员拿到,随便泄露,比如辞职之后,公开代码,随意上传网上之类的,静态库可以有效避免这种情况.
为什么不使用动态库?
因为沙盒机制使得程序之间不能进行数据的相互访问,苹果也不让上架包含自己创建的动态库APP,所以一般使用静态库,但是企业APP可以,平时调试也可使用.所以一般来说需要上架的APP只能使用静态库,
详解:静态库其实就是一堆.o文件的集合,我们知道 test.c-->test.o-->a.out 文件通过编译链接会生成test.o,这个就是目标文件,这个过程可以通过clang -c test.c 可以获得test.o文件,
clang test.c--->a.out
file test.o 打印结果: test.o: Mach-O 64-bit object x86_64,(MACH-O目标文件)
file a.out 打印结果: a.out: Mach-O 64-bit executable x86_64(MACH-O可执行文件)
说明: 因为静态库的本质就是.o文件的集合, .a/.framework 的静态库文件实质就是预处理,编译过后的文件,载入内存之后,只需链接就可运行,对于理解本质很有帮助.
Snip20200427_9.png 重要的一点,当添加到工程文件中之后要手动添加依赖,否则手动运行会报错, Snip20200427_6.png
也可以在新的工程创建静态库,然后拖到使用的工程里,(注意 必须包含头文件 和 静态库文件 -->include,XXX.a),导出来的文件要想在真机和模拟器下运行还要配置一个参数
image.png 这个参数的意思是全架构包含,即真机-模拟器-arm64,armv7,armv7s等,所以打出来的包会比较大,需要把运行设备在,模拟器和真机分别编译, image.png 此时会生成四个文件,分别为Debug-Release下的 模拟器-真机 版本
image.png
如果需要在真机-模拟器测试,需要合并Debug-iphonesimulator,Debug-iphoneos两个版本,
需要发布模式的话,需要合并Release-iphonesimulator, Release-iphoneos两个版本,
lipo -create 路径1 路径2 -output 输出包名 (注意这个路径是静态库.a的文件路径,不是Release-iphonesimulator这类文件夹的路径)
本人合并的是Debug下的模拟器和真机版本,
下图可看出YPSDK01 (for architecture x86_64):对应的是模拟器版本
image.png
若要拆分某个多架构的MACH-O文件,可用如下命令:
lipo 文件路径 -thin 架构类型 -output 输出文件路径
2>.framework的创建和使用
同样操作,只是选择Framework Snip20200427_10.png 其中有个注意点,就是需要配置文件类型,选择静态库文件 image.png心得体会:
一门语言的学习 首先会告诉你怎么做,越来越深入的时候,底层的逻辑会告诉你为什么这么做,学好,学深一门语言,远比了解多门语言的简单实用的重要,因为编程语言的本质都是相似的,知识也是学不完的,学本质,不要纠结语法糖层面的东西,同时要有深入钻研的精神,不要流于表面,人云亦云.
网友评论