2011-11-29 12 views
10

Ho provato a utilizzare lo strumento perdite e "analizzare" ecc. Per trovare la perdita, ma non riesce a trovarla. Usando le allocazioni posso determinare gli oggetti che non vengono rilasciati.Come posso determinare quali oggetti contengono riferimenti ad altri oggetti che causano perdite di memoria nell'obiettivo-c?

Ho notato (aggiungendo le istruzioni di debug nel metodo dealloc), che dealloc non viene chiamato per questi oggetti.

Come è possibile determinare quali oggetti contengono riferimenti a questi oggetti e impedire che vengano rilasciati?

+0

Gli oggetti non "tengono" i riferimenti. Piuttosto, i conteggi di riferimento sono incrementati dai metodi. –

+0

Hai ragione. Intendevo che stavo cercando di determinare quali oggetti non riducono il conteggio dei ritiri quando sono fatti con gli altri oggetti .. – xcoder

risposta

2

Lo strumento di analisi era in grado di rilevare il problema. L'utilizzo dello strumento di allocazione per acquisire tutti i conteggi di riferimento era un inizio, ma c'erano così tante classi che non riconoscevo, o accesso diretto, non ero in grado di rintracciare il problema usando questo metodo. Invece, ho fatto un elenco delle classi di cui ero direttamente responsabile e ho esaminato ciascuna riga riga per riga finché non ho trovato i problemi. La causa era che usavo alcune librerie di terze parti che non diminuivano il numero di ritenzione di alcuni dei miei oggetti come previsto. Immagino che in questo caso, seguendo i migliori principi di progettazione del software/schemi di progettazione, e avendo recensioni approfondite del codice possa aver colto il problema in precedenza.

+2

Sì, in definitiva le attente pratiche di codifica e la revisione approfondita del codice sono i modi migliori per catturare la maggior parte di questi bug (e molti altri). –

+0

Sì. Credo che si dovrebbe usare il metodo che hai citato PRIMA di ricorrere allo strumento di analisi. È molto più semplice controllare il proprio codice per assicurarsi che il problema non sia presente prima di analizzarlo. – braden

1

Vorrei iniziare con la costruzione e l'analisi del progetto (Shift Command B nell'IDE).

+0

Ho provato questo, ma "analizzare" a volte non lo trova. – xcoder

1

È possibile sovraccaricare le implementazioni di mantenimento/rilascio/autorelease in classi problematiche (se è una classe SDK, è possibile utilizzare una categoria) e impostare il punto di interruzione lì. Il punto di interruzione verrà colpito ogni volta che qualcosa mantiene il tuo oggetto.

+0

Questa è un'ottima soluzione se un'accurata codifica e revisione THEN analizzano ancora non ti danno una risposta. – braden

11

Se avete bisogno di vedere dove conserva, stampa e autoreleases si verificano per uno strumenti uso oggetto:

Run in strumenti, in dotazioni fissate "conta di riferimento di registrazione" a on (si deve fermare la registrazione per impostare l'opzione). Causa il picker di eseguire, interrompere la registrazione, cercare lì ivar (datePickerView), drill-down e sarete in grado di vedere dove si sono verificati tutti i ritardi, rilasci e autoreleases.

enter image description here

+0

Buona idea. L'ho fatto. Ho trovato davvero difficile rintracciare chi ci teneva in mano poiché c'erano troppe classi che non riconoscevo o accesso diretto. Alla fine ho appena creato un elenco di classi che conosco che accedono direttamente al mio oggetto e le ho esaminate una per una. – xcoder

+7

Per chiunque si chieda, l'opzione "Conteggio dei riferimenti conta" è nascosta dietro la "i" accanto a "Allocazioni" nel riquadro di sinistra http://snag.gy/F39G0.jpg – yonilevy

+0

Non riesci a sopravvalutarlo abbastanza! Molte grazie. –

Problemi correlati