Заменить OBJC_IVAR_$ в двоичном

В более старой версии фреймворка было два класса, A и B, причем A является подклассом B. В более новой версии B больше не существует, и все в B (ivars и т. Д.) Теперь находится в A. Исполняемый файл связан со старой версией, поэтому он ищет _OBJC_IVAR_$_B.ivar. Однако мне нужно, чтобы он работал над новой версией (я не могу перекомпилировать ее). Так есть ли способ изменить ссылку на _OBJC_IVAR_$_A.ivar?

1 ответ

Решение

Нет способа сделать это безопасно. Мало того, что символ должен быть разрешен, но время выполнения, вероятно, сработает по этому символу. Псевдоним символа может работать, но он будет хрупким.

Исполняемый файл, который зависит от более старой версии фреймворка и может напрямую ссылаться на символ ивара, потребует совместимости макетов классов, что включает наличие этого подкласса с этими иварами.

Когда Objective-C "2.0" решил проблему хрупкого базового класса, он не добавил возможность перемещать ивары из класса в класс (потому что и у A, и у B мог быть ивар с одним и тем же именем - вполне допустимо, хотя и подозрительно).


Если вам абсолютно необходимо пойти по этому пути, вы можете попробовать использовать псевдоним символа в строке ссылки. Добавьте соответствующий флаг псевдонима для 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.
Другие вопросы по тегам