如何确定已编译的Objective-C应用程序是否正在使用垃圾回收?

kch*_*kch 10 macos cocoa garbage-collection objective-c

对于我在Mac上的任何应用程序,有没有办法判断它是在启用GC的情况下编译的,还是在进行手动内存管理?

kch*_*kch 19

我在这里找到了答案.你要知道原来的职位是错误的,而是包含了评论马克·罗,苹果的工程师,指向的方式.

otool用当前的OS(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

Mark Rowe的解释:

这里感兴趣的领域是该__image_info部分的"标志"字段__OBJC.如果支持垃圾收集,它将具有该值0×2并将显示为"GC RR"以表示支持垃圾收集和保留/释放.如果需要垃圾收集,那么该字段将具有该值0×4,并将显示为"仅GC",表示仅支持垃圾收集并且保留/释放不可用.该字段还可以包含其他值,但这两个值是与垃圾收集相关的唯一值.


bbu*_*bum 5

在mach-o中是一个标志,用于确定是否使用GC支持编译的二进制文件,非GC或混合模式.

我不知道通过更友好的API查询这些位的任何事情.

Objective-C运行时中的markgc.c源可以读取所述标志.您可以根据需要重构它以满足您的需求.

有点好奇为什么你需要知道?