Frage

Ich habe ein Problem, dass ich EX_BAD_ACCESS bin immer wenn Release auf dem iPhone auf einem NSStream Objekt in meinem dealloc aufrufen.

Der folgende Code

- (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);
    }

stürzt mit EX_BAD_ACCESS auf dem     [OutStream Release]; Linie.

Protokollausgabe ist wie folgt

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

Frage mich, ob jemand eine Idee hat, warum dies sein könnte?

War es hilfreich?

Lösung

In einem Kommentar sagte Sie diese über outstream

  

Es ist von einem Anruf erstellt   getStreamsToHostNamed: port: input: output:   die nicht zurückkehren Autoreleased   Ich Objekte nicht denken.

Es ist in der Tat, Auto-Freigabe. Sofern Sie das Objekt irgendwo im Code zu halten, sind Sie für die Speicherverwaltung davon nicht verantwortlich.

Sie sollten einen Blick auf die Apple-Memory-Management-Richtlinien .

  

Viele Klassen bieten Methoden der   form + classname ..., die Sie verwenden können   eine neue Instanz der Klasse erhalten.   Oft als „Bequemlichkeit bezeichnet   Konstrukteure“, diese Methoden erstellen   neue Instanz der Klasse, initialisieren   es, und senden Sie es für Sie zu nutzen.   Obwohl Sie vielleicht denken, Sie sind   verantwortlich Objekte für die Freigabe   auf diese Weise geschaffen, ist das nicht   der Fall nach der Politik Cocoa   Set-der Methodenname nicht enthält   „Alloc“ oder „Kopie“ oder beginnen mit   "Neu". Da die Klasse erstellt die   neues Objekt, ist es verantwortlich für   Entsorgung des neuen Objekts.

Andere Tipps

Einige mögliche Probleme:

  • Sie sind auf selbstsichernde die lookupCount Dekrement Schleife zu tun, was ich davon ausgehen, bedeutet, dass Sie diesen Code erwarten von verschiedenen Threads ausgeführt werden soll. Das sollte eine rote Fahne da sein, denn wenn Sie eine Instanz von zwei Threads sind Aufheben von Zuweisungen gleichzeitig, eine dieser Fäden wird versucht, am Ende eine bereits ausgeplanten Instanz dealloc.
  • Der letzte NSLog Anruf wird versuchen self zu drucken, die bereits freigegeben worden wäre.

Ich weiß keiner dieser betrifft speziell auf [outStream release], aber sie konnten in Beziehung gesetzt werden. Vielleicht möchten Sie das Debuggen, dies versuchen, mit NSZombieEnabled mehr Informationen zu erhalten.

Also, stellen Sie sicher, dass inStream Freigabe auch nicht implizit outStream loslassen, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top