Для какого-либо приложения, которое я имею на своем Mac, там способ сказать, было ли это скомпилировано с GC, включенным, или если это делает ручное управление памятью?
Я нашел ответ здесь . Имейте в виду, что исходное сообщение неверно , но содержит комментарий Марка Роу , инженера 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
Интересующее нас поле - это поле «flags» раздела
__ image_info
сегмента__ OBJC
. Если поддерживается сборка мусора, она будет иметь значение0 × 2
и будет отображаться как «GC RR» для означают, что поддерживаются как сборка мусора, так и сохранение / освобождение. Если сборка мусора требуется , тогда поле будет иметь значение0 × 4
и будет отображаться как «Только сборщик мусора», что означает поддерживается только сборка мусора, а сохранение / освобождение недоступно. Поле также может содержать другие значения, но только эти два значения имеют отношение к сборке мусора.
Внутри mach-o есть флаг, используемый для определения того, компилируется ли двоичный файл с поддержкой GC, для не-GC или в смешанном режиме.
Я не знаю ничего, что могло бы запросить эти биты через более дружественный API.
Источник markgc.c в среде выполнения Objective-C может читать эти флаги. Вы можете рефакторить его под свои нужды, по желанию.
Любопытно, зачем вам это нужно?