2009-12-31 15 views
18

Attualmente sto facendo quanto segue per cancellare un NSMutableDictionaryCome cancellare un dizionario?

[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

La linea di rilascio in realtà non rilasciare alcun oggetto nel dizionario. Posso ancora vederli tutti nella riga successiva. Non è fino a quando la linea di allocazione viene eseguita che il dizionario è azzerato. C'è un modo migliore per farlo?

risposta

32
+0

Hai ragione. Per qualche ragione, non è apparso nel suggerimento sul codice quando ho provato inizialmente ... quindi ho pensato che non fosse disponibile. Ora lo vedo. Grazie. – 4thSpace

+5

Questo non risponde alla domanda. '-release' sul dizionario rilascerà tutti gli oggetti contenuti. 4thSpace ha un problema diverso. – bbum

+0

Voglio solo dire che se rilasci un NSDictionary e gli oggetti non vengono rilasciati, significa che quegli oggetti hanno un retainCount di più di uno, il che significa che vengono sovrascritti o non vengono rilasciati correttamente altrove. Quando aggiungi gli oggetti al dizionario, li stai rilasciando (o li autorizzi automaticamente) correttamente? – lucius

6

-removeAllObjects funzionerà, come Andy menzionato. Tuttavia, se uno qualsiasi degli oggetti del tuo dizionario viene rilasciato automaticamente, o se il dizionario stesso è stato autorizzato automaticamente da qualche parte lungo la linea, non sarà deallocato fino alla successiva esecuzione del runloop (quando il pool di autorelease viene scaricato) .

30

Tu dici:

linea l'emissione non è in realtà rilascio oggetti nel dizionario. Posso ancora vederli tutti sulla riga successiva . Solo quando viene eseguita la riga di allocazione il dizionario viene azzerato. C'è un modo migliore per farlo?

Se -release del dizionario mutevole provoca il dizionario viene deallocato - gocce il conteggio conservano a zero - allora il dizionario mutevole rilascerà tutti gli oggetti contenuti. Sempre.

Così, se gli oggetti non vengono rilasciate, allora questo ha suggerito "correzione" ...

[myDictionary removeAllObjects]; 
[myDictionary release]; 
myDictionary = [[NSMutableDictionary alloc] init]; 

... è una perdita di memoria in quanto l'istanza originale di NSMutableDictionary sarà trapelato.

Di conseguenza, chiamando -removeAllObjectssarà vuota il dizionario e rilasciare tutti gli oggetti contenuti, ma avete ancora una perdita di memoria che si dovrebbe capire e risolvere.


Per essere franchi:

Se gli oggetti nel vostro dizionario non vengono deallocate quando il dizionario riceve il sopra -release (senza chiamare -removeAllObjects), poi c'è una perdita di memoria. Si tratta di uno:

  1. Gli oggetti nel dizionario sono state mantenute un tempo supplementare.

  2. C'è ancora uno straordinario -retain sul dizionario.

Dal momento che si dice gli oggetti sono in corso in modo corretto (come in, come previsto) deallocato quando si chiama -removeAllObjects, allora deve essere (2). Guarda il tuo codice e scopri dove c'è un altro -retain del dizionario. È possibile utilizzare lo strumento Oggetto Alloc per capire esattamente da dove provengono tutti i retain.

+0

-removeAllObjects funziona senza chiamare -release. Stai dicendo che è ancora una perdita di memoria? – 4thSpace

+0

Sì. Il dizionario è trapelato. – bbum

2
[aMutableDictionary removeAllObjects]; 

da Apple's documentation:

(void)removeAllObjects

Descrizione - svuota il dizionario delle sue voci. A ciascun tasto e all'oggetto valore corrispondente viene inviato un messaggio di rilascio.

disponibilità - iOS (2.0 e versioni successive)