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?

È stato utile?

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 stampare self 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top