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?
risposta
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
Il campo di interesse qui è il campo “bandiere” della sezione
__image_info
del segmento__OBJC
. Se la raccolta dati obsoleti è supportata, avrà il valore0×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 valore0×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.
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. –
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. –
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
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?
- 1. Il nuovo LISP utilizza la garbage collection?
- 2. Cosa succede durante la Garbage Collection se la seconda è compilata?
- 3. impedisce la garbage collection
- 4. Unity3D: ottimizza la garbage collection
- 5. Come profilare la garbage collection in Ruby
- 6. Forcing Garbage Collection
- 7. GWT Garbage Collection
- 8. Come minimizzare la garbage collection in Go?
- 9. Garbage Collection e puntatori condivisi
- 10. Chiarimento PHP Garbage Collection
- 11. Posso forzare Garbage Collection in Java?
- 12. Generatori PHP - Garbage Collection
- 13. Scala Garbage Collection?
- 14. Lua: garbage collection + datiutente
- 15. indesiderati Garbage Collection
- 16. Utilizzando e Garbage Collection
- 17. Unusual Garbage Collection Patterns
- 18. Garbage collection - root node
- 19. java garbage collection
- 20. WinRT ha Garbage Collection?
- 21. Garbage collection in bash
- 22. Garbage collection e cgo
- 23. requestAnimationFrame garbage collection
- 24. Garbage Collection in Delphi
- 25. Background worker e garbage collection?
- 26. Che cos'è la garbage collection JavaScript?
- 27. C# Timers and Garbage Collection
- 28. Node.js e V8 garbage collection
- 29. Garbage collection in Perl threads
- 30. Numpy e matplotlib garbage collection
Sono curioso di sapere perché questa è una domanda interessante. Perché ti importa, fintanto che non perde? –
MacRuby è GC'd. Se inserisco il codice MacRuby direttamente nell'app, deve essere anche GC. Per esempio. Mail plugin. – kch