二进制化,静态库和动态库简介

静态库和动态库共同特点

  • 闭源(如:支付宝的SDK, 微信的SDK, 高德地图SDK等)
  • 看不到源码
  • 提高编译速度
  • MRC打的静态库,ARC可以直接用

静态库和动态库的区别

  • 静态库两种
    .a的静态库 .framework的静态库
  • 动态库
    .framework .dylib .tbd
  • 静态库:链接的时候, 会复制到可执行文件中,会有多份.
  • 动态库:只有一份,运行时会动态加载到内存.
  • 你自己使用动态库, 不容许上架。企业级应用才可以使用动态库

静态库制作

  • 创建时选择Static Library
  • 设置项里开放头文件,release/debug版本
  • 如果需要适配iPhone 5以下设备,选择Build Active Architeture Only选择NO,表示并非仅所选设备的架构
  • 合并真机和模拟器版本lipo -create ***.a ****.a -output *****.a
  • Framework静态库大致相同,只不过打包方式不一样。需要Build Settings设置Mach-O TypeStatic Library。默认创建的Framework为dynamically
  • 如果使用时,奔溃信息为image not found,用 file [filePath]查Framework二进制文件如果查看到Mach-O 64-bit dynamically...
  • 为了防止包里的资源文件被外部替换,需要给资源文件增加文件夹*.bundle,并在加入时选择references

静态库测试方式

  • 把Framework引入工程,并引入开放的头文件,使用的时候就可以直接双引号引入了。
  • -fno-objc-arc设置编译文件为MRC编译;ARC:Automatic Referene Counting工程编译选择设置为NO,则代码MRC编写。
  • lipo -thin arm64 [filepath] - output [newFileName]瘦身,仅保留arm64架构;
  • lipo -thin i386 [filepath] - output [newFileName]瘦身,去除i386架构。

工程二进制化

  • *.podspec引入时改s.source_files = 'path/Classes/**/*'s.source_files = 'path/Headers/**/*'
  • 增加s.vendored_frameworks = 'path/name.framework'
  • 修改某个库版本代码,想沿用原版本, git tag -d [version]先删除原tag,重建打版本提交git push origin [verison]
  • 如果改的源文件,pod更新不成功,pod cache clean -all清理pod缓存,并删除工程目录下的Pods文件夹,再pod install更新安装
  • 环境变量,用于控制加载的pod内容[环境变量]=1 pod install。*.podspec文件的环境变量,如,
if ENV['tz']  || ENV['OCRouter']
	s.soure_files = 'OCRouter/Classes/**/*'
else
	s.soure_files = 'OCRouter/Classes/**/*.h'
	s.vendored_frameworks = 'OCRouter/OCRouter/.framework'
end
  • 再次使用环境变量命令时,也需要清除缓存,并删除工程目录下的Pods文件夹,再pod install更新安装

你可能感兴趣的:(iOS架构,iOS开发笔记,iOS组件化)