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