1

Dans un cellForRowAtIndexPath tableview, je fais ce qui suit:ne peut pas libérer objet sans écraser

MapViewController *mapView = [[MapViewController alloc] initWithCoordinates:city.Latitude longitude:city.Longitude]; 
[cell addSubview:mapView.view]; 
//[mapView release]; -- will crash here 

L'appel de la dernière ligne donne cette erreur de mémoire EXC__BAD _access ». Comment puis-je libérer la mémoire ci-dessus que j'ai allouée sans crash?

De dessus, la cellule est UITableViewCell.

MapViewController est un UIViewController qui implémente MKReverseGeocoderDelegate et MKMapViewDelegate. Dans init de MapViewController, il alloue un MKMapView. Dans ce document ajoute viewDidLoad du contrôleur, le MapView à la vue de UIViewController:

[self.view addSubview:mapView]; 

Répondre

1

Je pense que vous allez avoir besoin de ce rearchitect. Sans voir tout le code, je ne peux pas être sûr à 100%, mais il semble que vous vous débarrassiez de MapViewController avant d'en avoir fini avec. Oui, vous ne l'utilisez plus explicitement, mais la vue que vous en avez retirée ne contient presque certainement pas de retenue contre son contrôleur de vue (en général, les contrôleurs conservent les vues, et non l'inverse). Donc, quand vous le libérez, les sous-vues que vous venez d'ajouter se réfèrent à un objet désalloué. Vous pouvez tester cela en activant NSZombies.

Vous devez libérer MapViewController après que la vue à laquelle il est attaché soit retirée de la cellule. Vous devriez probablement sous-classer UITableViewCell et rendre le MapViewController un ivar de cette classe. Ensuite, vous pouvez le libérer au cours de la routine des cellules dealloc.