Как определить, использует ли скомпилированное приложение Objective-C сбор мусора?

Для любого приложения, которое у меня есть на моем Mac, есть ли способ определить, был ли он скомпилирован с включенным GC или если он выполняет ручное управление памятью?

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

Вид любопытных, почему вам нужно знать?