2012-04-08 9 views
0

So versuche ich derzeit, einen IndexPath zu speichern und darauf zuzugreifen, aber ich empfange immer noch den Fehler EXC_BAD_ACCESS, und wenn ich das Analysewerkzeug in xcode verwende, heißt es, dass der Wert in meinem IndexPfad gespeichert wird Initialisierung wird nie gelesen. Kann mir jemand helfen und mir sagen, was hier schief läuft?Speicherverwaltungsproblem mit NSIndexPath

Methode indexPath einzustellen:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

NSURL *requestURL = [[NSURL alloc] initWithString:@"URL"]; 

//The request 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:requestURL]; 

request.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:indexPath,@"indexPath", nil]; 

[request setDelegate:self];  

[request startAsynchronous]; 
[requestURL release]; 
[request release]; 
} 

Methode indexPath zuzugreifen:

-(void)requestFinished:(ASIHTTPRequest *)request{ 

UIImage *foodImage = [[UIImage alloc] initWithData:[request responseData]]; 

NSIndexPath *indexPath = [request.userInfo objectForKey:@"indexPath"]; 

FoodDescription *detailViewController = [[FoodDescription alloc] initWithNibName:@"FoodDescription" bundle:nil]; 

// pass the food 
detailViewController.aFood = [[NSMutableDictionary alloc] initWithDictionary:[_foodArray objectAtIndex:indexPath.row]]; 
detailViewController.foodPicture = foodImage; 
detailViewController.restaurantName = _restaurantName; 

// Pass the selected object to the new view controller. 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 
} 

Antwort

2

Sie ordnen einen NSIndexPath zu, und Sie schreiben ihn dann mit Ihrer nächsten Anweisung. Was noch schlimmer ist, Sie haben den Speicher freigegeben, der in der ersten Anweisung zugewiesen wurde. Dies ist wahrscheinlich, was der statische Analysator annahm. Was den Absturz verursacht, ist, dass Sie versuchen, das Objekt, das das Objekt von der ersten Anweisung überschrieben hat, freizugeben. Da es bereits automatisch freigegeben wurde, führt dieses zu einem Absturz.

Verwenden Sie einfach:

NSIndexPath *indexPath = [request.userInfo objectForKey:@"indexPath"]; 

und die Beseitigung der Freigabeerklärung erhalten. Du solltest gut sein.

+0

Nun, Sie haben das Problem mit dem IndexPath behoben, aber es stürzt immer noch aus irgendeinem Grund ab. Ich denke, es hat etwas mit dem userInfo-Wörterbuch zu tun, aber hast du eine Idee, warum ich immer noch EXC_BAD_ACCESS bekomme? Ich habe den IndexPath-Code zu Ihrem Vorschlag geändert und die [indexPath-Version] gelöscht ... – Apollo

+0

@ derek.lo Tritt Ihr Absturz immer noch an der gleichen Stelle auf? Sie sollten nicht nur abstürzen, um auf '[request.userInfo objectForKey: @" indexPath "];' zugreifen zu können (obwohl es denkbar wäre, dass nil zurückgegeben wird). – trudyscousin

+0

Ich habe meinen Beitrag mit der vollständigen Methode bearbeitet, bei der der Absturz auftritt. Könnte es sein, dass ich Objekte von einer Ansicht zur anderen übertrage? – Apollo

0

Nun, zuerst ordnen Sie ein neues Objekt, und speichern Sie es in indexPath. Dann überschreiben Sie diesen neu zugewiesenen Indexpfad mit dem, den Sie zuvor in didSelectRowAtIndexPath gespeichert haben. Daher ist der neu zugewiesene Indexpfad verloren und Sie erhalten einen Fehler.

Darüber hinaus versuchen Sie dann, dieses Objekt, das Sie in didSelectRowAtIndexPath gespeichert haben, freizugeben, ohne es "zu besitzen", also stürzt Ihre App ab.

Verwandte Themen