Problema di rilascio di Objective-C su iPhone
-
03-07-2019 - |
Domanda
Ho un problema con EX_BAD_ACCESS quando chiamo il rilascio su un oggetto NSStream nel mio dealloc su iPhone.
Il seguente codice
- (void)dealloc {
DLog(@"dealloc started for: %@",self);
@synchronized(self) {
lookupCount--;
if (lookupCount==0) {
UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = NO;
}
}
DLog(@"inStream retain count before release: %d",[inStream retainCount]);
[inStream release];
DLog(@"outStream retain count before release: %d",[outStream retainCount]);
[outStream release];
[queryToSend release];
[resultString release];
[data release];
[super dealloc];
NSLog(@"dealloc finsihed for : %@",self);
}
si arresta in modo anomalo con EX_BAD_ACCESS sul [versione a monte]; linea.
L'output del registro è il seguente
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 160] dealloc started for: <SimpleQuery: 0x56e540>
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 168] inStream retain count before release: 1
2009-04-29 13:16:28.548 App[30580:20b] -[SimpleQuery dealloc] [Line 170] outStream retain count before release: 1
Ti chiedi se qualcuno ha qualche idea sul perché questo potrebbe essere?
Soluzione
In un commento hai detto questo su outstream
È creato da una chiamata a getStreamsToHostNamed: port: inputStream: outputStream: che non dovrebbe restituire il rilascio automatico oggetti che non penso.
È infatti rilasciato automaticamente. A meno che tu non mantenga quell'oggetto da qualche parte nel tuo codice, non sei responsabile della gestione della memoria di esso.
Dovresti dare un'occhiata alle Linee guida per la gestione della memoria di Apple .
Molte classi forniscono metodi di form + className ... che puoi usare per ottenere una nuova istanza della classe. Spesso indicato come "convenienza" costruttori & # 8221 ;, questi metodi creano un nuova istanza della classe, inizializza e restituiscilo per l'uso. Anche se potresti pensare di esserlo responsabile del rilascio di oggetti creato in questo modo, non lo è il caso secondo la politica del cacao imposta & # 8212; il nome del metodo non contiene & Quot; alloc " o " copia " oppure inizia con & Quot; nuovo " ;. Perché la classe crea il nuovo oggetto, è responsabile eliminazione del nuovo oggetto.
Altri suggerimenti
Alcuni potenziali problemi:
- Ti stai bloccando da solo per eseguire il ciclo di decremento lookupCount, che presumo significhi che questo codice verrà eseguito da thread diversi. Dovrebbe esserci una bandiera rossa proprio lì, poiché se si sta deallocando un'istanza da due thread contemporaneamente, uno di quei thread finirà per provare a deallocare un'istanza già deallocata.
- L'ultima chiamata
NSLog
proverà a stampareself
che sarebbe già stato deallocato.
So che nessuno di questi si riferisce specificamente a [versione outStream]
, ma potrebbero essere correlati. Potresti provare a eseguire il debug con NSZombieEnabled per ottenere maggiori informazioni.
Inoltre, assicurati di rilasciare inStream
non rilasci implicitamente anche outStream
, ecc.