Для любого приложения, которое у меня есть на моем Mac, есть ли способ определить, был ли он скомпилирован с включенным GC или если он выполняет ручное управление памятью?
Как определить, использует ли скомпилированное приложение Objective-C сбор мусора?
Ответ 1
Я нашел ответ здесь. Имейте в виду, что исходный пост неправильный, но содержит comment от Марк Роу, специалист по Apple, который указывает путь.
Я повторно запустил команды otool
, которые он упоминает на моей машине, с текущей ОС (10.6.4). Здесь вывод:
$ uname -a Darwin meaningless.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 ### Mail doesn't use GC $ otool -oV /Applications/Mail.app/Contents/MacOS/Mail | tail -3 Contents of (__DATA,__objc_imageinfo) section version 0 flags 0x0 ### Xcode supports GC and retain/release $ otool -oV /Developer/Applications/Xcode.app/Contents/MacOS/Xcode | tail -3 Contents of (__DATA,__objc_imageinfo) section version 0 flags 0x2 OBJC_IMAGE_SUPPORTS_GC
Здесь поле интереса представляет собой поле "флаги" раздела
__image_info
сегмента__OBJC
. Если сбор мусора поддерживается, он будет иметь значение0×2
и будет отображаться как "GC RR" для что обе коллекции мусора и сохранение/выпуск поддерживаются. Если сбор мусора, то поле будет иметь значение0×4
и будет отображаться как "только GC", указывающее что поддерживается только сбор мусора и что сохранение/освобождение недоступно. Поле могут также содержать другие значения, но эти два являются единственными значениями, которые имеют отношение к сбору мусора.
Ответ 2
Внутри mach-o используется флаг, используемый для определения того, является ли бинарный файл с поддержкой GC, для не-GC или смешанного режима.
Я не знаю ничего, что запрашивает эти биты через более дружественный API.
Источник markgc.c в среде Objective-C может читать указанные флаги. Вы могли бы реорганизовать его в соответствии с вашими потребностями.
Вид любопытных, почему вам нужно знать?