美文网首页程序员
iOS-OC-静态库的基本介绍

iOS-OC-静态库的基本介绍

作者: 洧中苇_4187 | 来源:发表于2020-04-27 11:21 被阅读0次

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 -c (只运行预处理、编译和组装步骤) Snip20200427_12.png

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 的静态库文件实质就是预处理,编译过后的文件,载入内存之后,只需链接就可运行,对于理解本质很有帮助.

2>静态库的创建 Snip20200427_8.png
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):对应的是模拟器版本

YPSDK01 (for architecture arm64):对应的是真机版本 image.png 当你把这个静态库文件添加到新的工程时候,注意检查以下两个地方,否则可能运行会报错,(编译必须包含使用的静态库头文件,链接包含该静态库)
image.png

若要拆分某个多架构的MACH-O文件,可用如下命令:
lipo 文件路径 -thin 架构类型 -output 输出文件路径

2>.framework的创建和使用

同样操作,只是选择Framework Snip20200427_10.png 其中有个注意点,就是需要配置文件类型,选择静态库文件 image.png

心得体会:

一门语言的学习 首先会告诉你怎么做,越来越深入的时候,底层的逻辑会告诉你为什么这么做,学好,学深一门语言,远比了解多门语言的简单实用的重要,因为编程语言的本质都是相似的,知识也是学不完的,学本质,不要纠结语法糖层面的东西,同时要有深入钻研的精神,不要流于表面,人云亦云.

相关文章

网友评论

    本文标题:iOS-OC-静态库的基本介绍

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