На Mac OS X с помощью Objective C 2, сменные пакеты могут быть скомпилированы с одной из трех настроек сборки "мусора":
-fobjc-gc
)-fobjc-gc-only
)Как можно программно запросить скомпилированный сменный пакет для определения, какая из этих трех настроек использовалась?
После ответа из DICIU Вы можете использовать API MACH-O . Вы должны разбирать сегменты, содержащиеся в двоичном файле и ищуте __ Objc один; Структура Segment_Command
позволяет доступом к флагам сегмента.
Вы также можете взглянуть на проект ProjectDump . Он имеет довольно полный парсер Mach-o.
Это часть сегмента __ 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*
Наверное, проще всего просто попробовать и загрузить пакет, используя метод NSBundle -loadAndReturnError:
. Если пакет не загружается из-за того, что настройки GC отличаются от настроек вашего приложения, то вы получите - NSExecutableRuntimeMismatchError
.