Asynchrone NSURLConnection Wirft EXC_BAD_ACCESS
Ich bin mir nicht wirklich sicher, warum mein code wirft eine EXC_BAD_ACCESS, ich habe die Richtlinien, die in der Apple-Dokumentation:
-(void)getMessages:(NSString*)stream{
NSString* myURL = [NSString stringWithFormat:@"http://www.someurl.com"];
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:myURL]];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
receivedData = [[NSMutableData data] retain];
} else {
NSLog(@"Connection Failed!");
}
}
Und meine Stellvertretung Methoden
#pragma mark NSURLConnection Delegate Methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//This method is called when the server has determined that it
//has enough information to create the NSURLResponse.
//It can be called multiple times, for example in the case of a
//redirect, so each time we reset the data.
//receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//Append the new data to receivedData.
//receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
//release the connection, and the data object
[connection release];
//receivedData is declared as a method instance elsewhere
[receivedData release];
//inform the user
NSLog(@"Connection failed! Error - %@ %@",
[error localizedDescription],
[[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//do something with the data
//receivedData is declared as a method instance elsewhere
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
//release the connection, and the data object
[connection release];
[receivedData release];
}
Bekomme ich eine EXC_BAD_ACCESS auf didReceiveData. Auch wenn diese Methode enthält einfach ein NSLog, bekomme ich die Fehlermeldung.
Hinweis: receivedData ist ein NSMutableData* in meiner header-Datei
Was ist "Daten" in der Zeile, die beginnt Ihre 'receivedData' variable?
InformationsquelleAutor Sheehan Alam | 2010-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden NSZombieEnabled break point und prüfen Sie, welches ist das befreite Objekt.
Überprüfen Sie auch:
das könnte in der connectionDidFinishLoading Methode, versuchen Sie, den code aus der Methode zu. wenn das das problem ist Ihr receivedData variable ist hier das Problem...
Ich auskommentiert alle code in connectionDidFinishLoading, und die app stürzt nicht ab mehr. Was denken Sie, ist falsch mit receivedData?
Sieht aus wie ich bin für den Empfang der Daten, aber meine Verbindung nicht zu wissen, Wann zu stoppen. Wo kann ich dies tun?
Alam: sagen Sie mir, in dem Delegierte der debugger gestoppt?
InformationsquelleAutor Manjunath
Dass ist nicht wahr. In den beiden folgenden, Sie die Regeln brechen:
In beiden Fällen, Sie tun nicht erhalten die
connection
Objekt mitalloc
eine Methode, beginnend mitnew
oder mitcopy
. Sie nicht eigenenconnection
in diesen Methoden. Sie müssen sich nicht frei in diese Methoden.Scheint es mir etwas heikel, dass Sie loslassen receivedData es auch. Ich schlage vor, Sie sofort in der Instanz-Variablen zu null, nachdem Sie es loslassen.
So, es wird nicht versehentlich gelöst moere als einmal.
InformationsquelleAutor JeremyP
Wenn Sie immer die Fehler auf didRecieveData unabhängig von der code drin, es sieht aus wie Ihre Stellvertretung freigegeben wurde?
Ich würde schauen, dass das Objekt mit der getMessages-Methode ist nicht freigegeben (oder autoreleased), bevor die Verbindung dfinished abrufen von Daten.
EDIT: Die Kommentare unten zeigen, dass meine obige Antwort ist falsch 🙂
War das problem in der recievedData variable - wurde Sie vorzeitig entlassen. Mark schlägt vor, die Freigabe in der dealloc-Methode des Objekts, das erstellt die Verbindung, so verdient er alle Anerkennung dafür!!!!
Es ist eine leichte Sache, um die Suche nach es - wenn Sie lassen Sie die recievedData in der dealloc-Methode hinzu, Sie wird Speicherverlust, wenn Sie anrufen getMessages mehr als einmal. Sie wird sich ändern müssen getMessages leicht :
didRecieveData
d.h. keine Zeilen code, nur eine leere Methode, zu bestimmen, ob seine Stellvertretung freigegeben und nicht etwas anderesauch wenn didReceiveData enthält keine Zeilen code, bekomme ich den gleichen Fehler. Die Stellvertretung selbst.
tun Sie das gleiche mit
didReceiveResponse
als gut, zu sehen, ob das hilft überhaupt, um das Problem einzugrenzengleiche Ergebnisse, wenn didReceiveResponse enthält keinen code
vielleicht nennen [self retain], nur um sicherzustellen, dass es nicht veröffentlicht wird??
InformationsquelleAutor deanWombourne
Ich habe den gleichen Fehler beim Debuggen mit dem Gerät, obwohl, es war kein problem in der simulation. Hinzufügen die folgende Codezeile nach dem loslassen receivedData das problem gelöst:
InformationsquelleAutor fsakar
Kommentieren JeremyP, wo er sagt, dass "In den beiden folgenden, Sie die Regeln brechen": Sheehan Alam ist mit folgenden Apple-code (eigentlich, cut ' N ' Paste) gefunden hier.
Ich möchte auch hinzufügen (und das ist etwas, dass nicht gut beantwortet hier), die "bauen und analysieren' flags eines "potenziellen Lecks" auf die NSURLConnection (initiiert durch ein "[NSURLConnection alloc]"). Aber wenn man setzt sich in einen [theConnection release] auf der NSURLConnection, in der gleichen Methode, es stürzt ab.
So haben wir etwas, das scheint, zu trotzen den 'Richtlinien für die Verwaltung des Speichers, noch funktioniert (afaik) und ist in der Apple-Dokumentation..
InformationsquelleAutor coco
Bekam ich EXC_BAD_ACCESS auf Asynchrone Aufruf an NSURLConnection.
Der code generiert wird, indem http://www.sudzc.com
Musste ich hinzufügen behalten zu
receivedData = [[NSMutableData data] retain];
und die callback-Methoden nicht schlimm access signal mehr.
wenn ich die
if ([response expectedContentLength] < 0)
{
NSLog(@"Connection error");
//here cancel your connection.
[connection cancel];
return;
}
als alle meine webservices sind abgebrochen, sonst funktioniert perfekt.
InformationsquelleAutor
Während es nicht die Antwort auf die ganze Frage, ich habe in diesem Fehler ein paar mal, weil ich die Anfrage HTTPBody zu einem NSString anstelle eines NSData. Xcode versucht, mich zu warnen.
InformationsquelleAutor Hafthor