Как я могу определить, использует ли скомпилированное приложение Objective C сборщик мусора? - PullRequest
10 голосов
/ 28 июня 2010

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

Ответы [ 2 ]

19 голосов
/ 28 июня 2010

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

5 голосов
/ 28 июня 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...