iOS——从静态库到分类加载-ObjC

这篇具有很好参考价值的文章主要介绍了iOS——从静态库到分类加载-ObjC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近深究了下依赖静态库分类,链接参数需要-ObjC的问题。

静态库

首先需要介绍一下我对静态库的理解。

分类

静态库本质上就是目标文件,是还没有链接的文件。静态库分两种:

  • 目标文件.o

  • 目标文件archive,通常是.a形式;

.a就是若干目标文件的集合压缩,可以通过ar来创建、查看和解压。

//创建
ar -r XX.a -A.o -B.o
//查看
ar -t XX.a
//解压
ar -x XX.a

.a文件结构

可以参考.a结构

合并.o

.a只是.o文件的简单压缩,每一个.o文件都保留了完整的MachO文件结构,这会造成浪费。所以可以通过合并.o文件来减小大小。

//这样合并会让所有符号都隐藏,可以加上-keep_private_externs
ld -r -o DD.o D1.o D2.o D3.o

我测试后,一个76MB大小的.a文件,可以缩小成7.5MB大小的.a文件。

合并.o的缺点

但是Xcode默认创建的静态库工程,生成的产物格式都是.a,很明显合并.o这个方法是有缺点的。

缺点就是,当你直接链接.o时,无论是否用到其中的符号,都会将.o里所有的符号都链接。

而使用.a时,只会链接用到的符号所在的.o的所有符号。

静态库OC分类方法

当我们链接静态库时,当静态库含有OC的分类,需要在链接参数加上-ObjC,否则会出现unrecognized selector报错。那么,为什么会出现这种报错呢?

OC方法调用

上面链接.a说了,引用到对应.o里的符号,才会链接所有符号,而OC方法是动态调用的。

大部分OC方法都是通过objc_msgSend调用的,你调用的方法,只是作为selector(也就是个字符串)传给了objc_msgSend,其实根本没引用到任何符号。

那对于OC对象,什么时候才引用到了符号呢?调用类的时候。比如[XXClass alloc],这时候引用到了符号XXClass。XXClass所在的.o文件就会被链接进来。

OC静态库结构

iOS——从静态库到分类加载-ObjC

 

可以看到分类和主类不是一个.o,当你调用分类方法时,分类.o里的符号你是一个也没引用到,分类.o完全没有被链接。所以才会导致报错。

如果你尝试在主类的.h.m里声明分类,你就会发现一切都正常了。这是因为分类符号和主类符号都在一个.o里,虽然只用到了主类的符号,但是分类也一起被链接进来了。

或者尝试在分类头文件声明一个C的函数或变量,主程序引用,你会发现也不会报错了。

总结

  • 链接.a时,用到里面哪个.o的符号,对应.o里的所有符号就都会链接进来,没有的.o就不会被链接进来。

  • 合并.o可以缩小体积,但是会导致所有符号都链接。

  • 静态库有分类要加-ObjC的原因是,分类和主类在两个.o里,分类的符号没有被引用到,所以分类.o没有被链接。文章来源地址https://www.toymoban.com/news/detail-407625.html

到了这里,关于iOS——从静态库到分类加载-ObjC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2308d的静态构造函数循环依赖示例

    原文 这里有两个论点:这不能是 CRT 构造器,因为它依赖于 D运行时 ,并且认为它应该进入 自己 的模块是一个 QoL 问题,当你想要 私有 到类而不是 私有 到模块时,可为 类 提供它,因为 语言 按期望工作,而这里不是. 亚当的示例: 因为依赖 D运行时 ,不能是 CRT 构造器,但也不能放进

    2024年02月13日
    浏览(42)
  • maven 项目依赖加载不出来

    1.依赖加载不出来,查看pom.xml放的位置是否对了 2.1下载mvn到本地,进行解压 2.2新建系统变量MAVEN_HOME,值直接指向安装目录D:apache-maven-3.9.2 2.3path变量中增加:%MAVEN_HOME%bin 2.4若仓库位置不在C盘用户下,则修改D:apache-maven-3.9.2conf/setting.xml中的localRepository。 搜索localRepository,

    2024年02月05日
    浏览(40)
  • HarmonyOS开发:走进静态共享包的依赖与使用

    在上一篇,我们进行了动态共享包的开发和使用,由于动态共享包有一定的局限性,比如,调用共享包资源还得要通过工具类进行调用,再比如仅用于应用内部代码、资源的共享,如果我想要开源,以远程依赖的方式给任何一个想要用的人进行使用,动态共享包就无法实现,

    2024年02月09日
    浏览(41)
  • 当IDEA加载一个MAVEN新项目时,加载不成功,无法加载依赖的解决方法

    此文为练习项目时的错误记录 当使用IDEA引入一个MAVEN新项目时,点击Reload maven按钮加载不成功,显示如下图界面: 在项目中的代码显示报红,如下图: 经查阅相关资料及反复尝试,解决方法如下: 进入File-Project Structure-Project,确认选择好自己版本的jdk,这里使用的是jdk1.

    2024年01月19日
    浏览(71)
  • maven加载依赖报错的解决方法

    点击刷新,加载所有maven项目的时候,maven加载依赖失败。 显示“无法解析mysql:mysql-connector-java:pom:8.0.27”,具体报错原因如下: 将上述报错信息进行翻译: 即此失败缓存在本地储存库中,直到nexus的更新间隔已过或强制更新,才会重新尝试解析。 1. 删除本地仓库中下载失败

    2024年02月03日
    浏览(42)
  • 微服务项目,maven无法加载其他服务依赖

    微服务项目,导入了工具类工程,但是一直报错,没有该类, 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置,我这是原来的maven,home  修改之后,就不报错了      

    2024年02月14日
    浏览(40)
  • 小米妙享中心加载失败电脑能发现手机,手机能发现电脑,无法打开镜像画面,无法打开最近文件,能够看到但是无法打开,无法流转应用,无法共享屏幕

            本人是小米笔记本PRO14锐龙版WIN11系统,手机是小米14pro,电脑刚买来的时候都是可以正常在电脑投屏的,最近投屏总是失败报错,查了很久才解决这个问题可以正常投屏,所以发出来跟大家分享一下,以作参考。         首先要保证电脑上安装了小米妙享的最新

    2024年02月04日
    浏览(179)
  • 【Java可执行命令】(十二)依赖分析工具jdeps:通过静态分析字节码并提取相关信息来实现依赖分析 ~

    Java中的 jdeps 命令是一个用于分析类或 JAR 文件的工具,它能够帮助开发者识别出类之间的依赖关系。 jdeps 命令最早于Java 8版本中引入,旨在帮助开发者识别出Java类之间的依赖关系。其设计目的是为了帮助开发者在进行代码重构、迁移、与外部库集成等操作时,更好地了解库

    2024年02月14日
    浏览(79)
  • vue项目打包,解决静态资源无法加载和路由加载无效(404)问题

    打包后的项目静态资源无法使用,导致页面空白 静态资源无法使用,那就说明项目打包后,图片和其他静态资源文件相对路径不对,此时找到config里面的index.js,在build模块下加入 assetsPublicPath: \\\'./\\\',  如下图所示,或者是在打包完的dist文件夹中找里面的.js文件,将其中的\\\'/\\\'替

    2024年02月08日
    浏览(57)
  • 2308C++静态加载文件或向量

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包