Как программно определить параметры сборки мусора в комплекте с плагином Какао? - PullRequest
6 голосов
/ 19 января 2010

В Mac OS X с использованием Objective-C 2 комплекты плагинов могут быть скомпилированы с одним из трех параметров сборки мусора:

  1. Не поддерживается
  2. Поддерживается (-fobjc-gc)
  3. Обязательно (-fobjc-gc-only)

Как можно программным способом запросить скомпилированный комплект плагинов, чтобы определить, какой из этих трех параметров был использован?

Ответы [ 3 ]

4 голосов
/ 19 января 2010

Это часть сегмента __OBJC, но я не знаю ни одного API, предоставляющего его.

Сборка мусора:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out:
Contents of (__DATA,__objc_classrefs) section
00000001000010b0 0x0
Contents of (__DATA,__objc_imageinfo) section
  version 0
    flags 0x6 OBJC_IMAGE_SUPPORTS_GC

Сборка не мусора:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out:
Contents of (__DATA,__objc_classrefs) section
00000001000010b0 0x0
Contents of (__DATA,__objc_imageinfo) section
  version 0
    flags 0x0

Среда выполнения делает это с помощью частных функций: см. gc_enforcer и использует * _objcInfoRequiresGC *

3 голосов
/ 19 января 2010

После ответа от diciu вы можете использовать Mach-O API . Вы должны проанализировать сегменты, содержащиеся в двоичном файле, и найти __ OBJC one; структура segment_command обеспечивает доступ к флагам сегмента.

Вы также можете взглянуть на проект ClassDump . У него довольно полный анализатор Mach-O.

1 голос
/ 19 января 2010

Вероятно, проще всего просто загрузить пакет, используя метод -loadAndReturnError: NSBundle. Если пакет не загружается из-за того, что его настройки GC отличаются от настроек в вашем приложении, вы получите NSExecutableRuntimeMismatchError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...