2010-06-28 6 views
10

Per qualsiasi applicazione che ho sul mio Mac, c'è un modo per dire se è stato compilato con GC abilitato, o se sta facendo gestione manuale della memoria?Come posso determinare se un'app Objective-C compilata utilizza la garbage collection?

+3

Sono curioso di sapere perché questa è una domanda interessante. Perché ti importa, fintanto che non perde? –

+0

MacRuby è GC'd. Se inserisco il codice MacRuby direttamente nell'app, deve essere anche GC. Per esempio. Mail plugin. – kch

risposta

19

Ho trovato la risposta here. Intendiamoci che il post originale è wrong, ma contiene uno comment di Mark Rowe, un ingegnere Apple, che indica la strada.

Ho ri-eseguito i comandi otool che menziona sulla mia macchina con il sistema operativo corrente (10.6.4). Ecco l'output:

 
$ 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's explanation:

Il campo di interesse qui è il campo “bandiere” della sezione __image_info del segmento __OBJC. Se la raccolta dati obsoleti è supportata, avrà il valore 0×2 e verrà visualizzato come "GC RR" su e rappresenta che sia la raccolta dati obsoleti sia il mantenimento/rilascio sono supportati. Se la garbage collection è richiesta, il campo avrà il valore 0×4 e verrà visualizzato come "Solo GC" che indica che solo la raccolta dati obsoleti è supportata e che il mantenimento/rilascio non è disponibile. Il campo può contenere anche altri valori, ma questi due sono gli unici valori rilevanti per la garbage collection.

+1

Su Lion, provare questo su ScreenSaverEngine e Xcode dà il risultato "flags 0x6 OBJC_IMAGE_SUPPORTS_GC". Non sono sicuro del modo in cui interpretarlo. –

+0

Peter, penso che GC fosse inizialmente richiesto per screen saver a 64 bit ma supportato solo per 32 bit. Forse la bandiera riflette entrambi in Lion. –

+0

Grandi cose; Curiosamente, a partire da OSX 10.11/Xcode 7.2, Xcode ora riporta 'flags 0x0' ('otool -o /Applications/Xcode.app/Contents/MacOS/Xcode | tail -1'). Infatti, tra tutte le app standard di Apple (Mail, Promemoria, Calendario, ...), solo "Preferenze di Sistema" riporta "flags 0x2 OBJC_IMAGE_SUPPORTS_GC' su 10.11 - tutti gli altri riportano" flags 0x0 ". Gli eseguibili basati su _Swift_ riportano come quello? – mklement0

5

All'interno del mach-o è un flag utilizzato per determinare se un file binario è compilato con supporto GC, per modalità non GC o mista.

Non so nulla che interroghi questi bit tramite un'API più amichevole.

L'origine markgc.c all'interno del runtime Objective-C può leggere i suddetti flag. Puoi refactoring alle vostre esigenze, come desiderato.

Tipo di curioso perché è necessario sapere?

+0

otool forse può? – kch

+0

come per il motivo, vedere il mio commento sulla domanda dopo Chris's. – kch

+0

Non credo che l'otool sputa le informazioni necessarie. Forse sì, però - dovrai analizzare l'output. – bbum