Cocoa touch Can';不要在不碰撞的情况下释放物体
在tableview cellForRowAtIndexPath中,我执行以下操作:Cocoa touch Can';不要在不碰撞的情况下释放物体,cocoa-touch,uitableview,iphone-sdk-3.0,uiviewcontroller,Cocoa Touch,Uitableview,Iphone Sdk 3.0,Uiviewcontroller,在tableview cellForRowAtIndexPath中,我执行以下操作: MapViewController *mapView = [[MapViewController alloc] initWithCoordinates:city.Latitude longitude:city.Longitude]; [cell addSubview:mapView.view]; //[mapView release]; -- will crash here 调用最后一行会导致此内存错误EXC
MapViewController *mapView = [[MapViewController alloc] initWithCoordinates:city.Latitude longitude:city.Longitude];
[cell addSubview:mapView.view];
//[mapView release]; -- will crash here
调用最后一行会导致此内存错误EXC\uuuu BAD\u ACCESS”。如何在不崩溃的情况下释放我分配的上述内存
从上面看,单元格是UITableViewCell
MapViewController是实现mkReverseGeoCodeDelegate和MKMapViewDelegate的UIViewController。在MapViewController的init中,它分配一个MKMapView。在控制器的viewDidLoad中,它将mapview添加到UIViewController的视图中:
[self.view addSubview:mapView];
我想你需要重新构建这个。如果没有看到所有的代码,我无法100%确定,但似乎您在使用MapViewController之前就已经将其删除了。是的,您不再显式地使用它,但是您从中拉出的视图几乎肯定不会对其视图控制器保留保留(通常控制器保留视图,而不是相反)。因此,当您释放它时,它将解除分配,现在您刚刚添加的子视图正在引用一个解除分配的对象。您可以通过打开NSZombies来测试这一点
从单元格中删除MapViewController所附着的视图后,需要解除分配MapViewController。您可能应该将UITableViewCell子类化,并使MapViewController成为该类的ivar。然后您可以在cells dealloc例程中释放它。我认为您需要重新构建它。如果没有看到所有的代码,我无法100%确定,但似乎您在使用MapViewController之前就已经将其删除了。是的,您不再显式地使用它,但是您从中拉出的视图几乎肯定不会对其视图控制器保留保留(通常控制器保留视图,而不是相反)。因此,当您释放它时,它将解除分配,现在您刚刚添加的子视图正在引用一个解除分配的对象。您可以通过打开NSZombies来测试这一点 从单元格中删除MapViewController所附着的视图后,需要解除分配MapViewController。您可能应该将UITableViewCell子类化,并使MapViewController成为该类的ivar。然后您可以在cells dealloc例程中释放它