Objective-C auf dem iPhone Release Problem
-
03-07-2019 - |
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?
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 versuchenself
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.