0

在旧版本的框架中,有两个类,A 和 B,A 是 B 的子类。在较新的版本中,B 不再存在,B 中的所有内容(ivars 等)现在都在 A 中。可执行文件是链接到旧版本,因此它会查找 _OBJC_IVAR__$_B.ivar。但是我需要它在新版本上工作(我不能重新编译它)。那么有没有办法改变对 _OBJC_IVAR__$_A.ivar 的引用呢?

4

1 回答 1

1

没有办法安全地做到这一点。不仅需要解析符号,而且运行时可能会绊倒该符号。符号别名可能有效,但它会很脆弱。

依赖于旧版本框架以直接引用 ivar 符号的可执行文件将要求类布局兼容,并且包括具有这些 ivar 的子类。

当Objective-C“2.0”解决了脆弱的基类问题时,它并没有增加将ivar从一个类移动到另一个类的能力(因为A和B都可以有一个同名的ivar——完全有效,尽管值得怀疑)。


如果您绝对必须走这条路,您可以尝试在链接行中为符号添加别名。在构建设置编辑器中向 OTHER_LD_FLAGS 添加适当的别名标志:

 -alias symbol_name alternate_symbol_name
             Create an alias named alternate_symbol_name for the symbol symbol_name.  By default the
             alias symbol has global visibility.  This option was previous the -idef:indir option.
于 2013-06-21T16:42:50.660 回答