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

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

10
задан kch 28 June 2010 в 03:39
поделиться

2 ответа

Я нашел ответ здесь . Имейте в виду, что исходное сообщение неверно , но содержит комментарий Марка Роу , инженера 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 и будет отображаться как «Только сборщик мусора», что означает поддерживается только сборка мусора, а сохранение / освобождение недоступно. Поле также может содержать другие значения, но только эти два значения имеют отношение к сборке мусора.

19
ответ дан 3 December 2019 в 16:51
поделиться

Внутри mach-o есть флаг, используемый для определения того, компилируется ли двоичный файл с поддержкой GC, для не-GC или в смешанном режиме.

Я не знаю ничего, что могло бы запросить эти биты через более дружественный API.

Источник markgc.c в среде выполнения Objective-C может читать эти флаги. Вы можете рефакторить его под свои нужды, по желанию.

Любопытно, зачем вам это нужно?

5
ответ дан 3 December 2019 в 16:51
поделиться