Come posso configurare NSZombieEnabled in Xcode 4?


456

Come faccio a configurare NSZombieEnablede CFZombieLevelper il mio eseguibile in Xcode 4?


1
stai chiedendo di Xcode 4?
Jehiah,

8
Perché opzioni come questa non sono abilitate di default è al di là di me ...
Daniel Magnusson,

26
Perché sostanzialmente impedisce qualsiasi reale liberazione di memoria, che non sembra una buona idea abilitare per impostazione predefinita.
Chetan,

14
@Daniel Magnusson: è la cosa più adatta a sopravvivere. Rendendo lo sviluppo con XCode ostile ma praticabile, ottieni sviluppatori migliori. Stavo solo scherzando.
Dan Rosenstark,

3
@DanielMagnusson Penso che questa non sia una cattiva idea, AFAIK la modalità "Zombie" cambierà ogni oggetto in un oggetto ob tipo speciale in modo che possa rilevare, quando viene inviato messaggi. Quindi avere la "modalità Zombi" abilitata farà sì che nessun oggetto venga mai deallocato, quindi dovresti davvero usarlo solo quando affronti tali errori.
Besi,

Risposte:


753

In Xcode 4.x premere

R

(o click Menubar> Product> Scheme> Edit Scheme)

seleziona la scheda "Diagnostica" e fai clic su "Abilita oggetti zombi":

Fai clic su "Abilita oggetti zombi"

Ciò trasforma gli oggetti rilasciati in istanze NSZombie che stampano gli avvisi della console quando vengono riutilizzati. Questo è un aiuto per il debug che aumenta l'uso della memoria (nessun oggetto è realmente rilasciato) ma migliora la segnalazione degli errori.

Un caso tipico è quando si rilascia un oggetto in eccesso e non si sa quale:

  • Con gli zombi: -[UITableView release]: message sent to deallocated instance
  • Senza zombi: EXC_BAD_ACCESS

Questa impostazione Xcode viene ignorata quando si archivia l'applicazione per l'invio all'App Store. Non è necessario toccare nulla prima di rilasciare l'applicazione.

Premere equivale Ra selezionare Prodotto> Esegui tenendo Altpremuto il tasto.
Fare clic sulla casella di controllo "Abilita oggetti Zombie" equivale ad aggiungere manualmente "NSZombieEnabled = YES" nella sezione "Variabili d'ambiente" della scheda Argomenti.


27
Grazie - Mi chiedevo dove nascondessero queste opzioni. Ora mi rendo conto che questa è la stessa finestra del menu "Modifica schema".
emp

1
Solo per aggiungere a questo, farlo nella schermata "Esegui" lo imposta per "Test" anche se la casella "Usa le opzioni dell'azione Esegui" è selezionata. Se vuoi farlo solo per Test, quella casella deve essere deselezionata
Cameron

1
Si noti inoltre che questa opzione appare su Xcode 4.1 (giusto?)
phi

2
In XCode 5 (e versioni successive di 4 - 4.3.x sicuramente, forse prima), questo è CMD-<( CMD-SHIFT-comma), oProduct -> Scheme -> Edit SCheme...
Olie,

1
Sono bloccato nello strano problema EXC_BAD_ACCESS, anche gli Zombi sono saltati, sarebbe bello se potessi dirigermi per questo stackoverflow.com/questions/29210057/…
Anoop Vaidya

70

La risposta di Jano è il modo più semplice per trovarla. Un altro modo sarebbe se si fa clic sulla barra a discesa dello schema -> modifica schema -> scheda argomenti e quindi si aggiunge NSZombieEnabled nella colonna Variabili d'ambiente e SÌ nella colonna valore ...


57

Trovo questa alternativa più conveniente:

  1. Fai clic sul menu a discesa "Esegui pulsante"
  2. Dall'elenco scegliere Profile
  3. Il programma "Strumenti" dovrebbe aprirsi dove è anche possibile scegliere Zombies
  4. Ora puoi interagire con la tua app e provare a causare l'errore
  5. Non appena si verifica l'errore, dovresti ottenere un suggerimento su quando l'oggetto è stato rilasciato e quindi deallocato.

Zombies

Non appena viene rilevato uno zombi, otterrai uno "Zombi Stack" ordinato che ti mostra quando l'oggetto in questione è stato allocato e dove è stato conservato o rilasciato:

Event Type    RefCt     Responsible Caller
Malloc            1     -[MyViewController loadData:]
Retain            2     -[MyDataManager initWithBaseURL:]
Release           1     -[MyDataManager initWithBaseURL:]
Release           0     -[MyViewController loadData:]
Zombie           -1     -[MyService prepareURLReuqest]

Vantaggi rispetto all'utilizzo della scheda diagnostica degli schemi Xcode :

  1. Se si dimentica di deselezionare l'opzione nella scheda diagnostica, non verranno rilasciati oggetti dalla memoria.

  2. Ottieni uno stack più dettagliato che ti mostra in quali metodi il tuo oggetto corrotto è stato allocato / rilasciato o mantenuto.


1
L'opzione "Zombi" non è presente nel mio XCode 4, perché?
Li Fumin,

4
Assicurati di scegliere iOS Simulator > Alldall'elenco dei modelli principale (puoi farlo solo nel simulatore)
Besi,

per qualche motivo .. se seleziono 'zombi' mostra solo le allocazioni .. qualche idea sul perché?
circa il

Questa è la soluzione migliore Mi ha aiutato molto :)
Michał Miszczyszyn,

5

In Xcode 4.2

  • Nome progetto / Modifica schema / Diagnostica /
  • Casella di controllo Abilita oggetti zombi
  • Hai finito


1

Cocoa offre una funzionalità interessante che migliora notevolmente le tue capacità di debug di tali situazioni. È una variabile d'ambiente che si chiama NSZombieEnabled, guarda questo video che spiega come impostare NSZombieEnabled in obiettivo-C


-1

In Xcode> 4.3:

Fare clic sulla barra a discesa dello schema -> modifica schema -> scheda argomenti e quindi aggiungere NSZombieEnabled nella colonna Variabili d'ambiente e SÌ nella colonna valore.

In bocca al lupo !!!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.