【问题标题】:Can't release object without crashing无法在不崩溃的情况下释放对象
【发布时间】:2009-07-06 23:01:02
【问题描述】:

在 tableview cellForRowAtIndexPath 中,我执行以下操作:

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

调用最后一行会产生此内存错误 EXC__BAD _ACCESS”。如何在不崩溃的情况下释放我分配的上述内存?

从上面看,cell 是一个 UITableViewCell。

MapViewController 是一个 UIViewController,它实现了 MKReverseGeocoderDelegate 和 MKMapViewDelegate。在 MapViewController 的 init 中,它分配了一个 MKMapView。在控制器的 viewDidLoad 中,它将 mapview 添加到 UIViewController 的视图中:

[self.view addSubview:mapView];

【问题讨论】:

    标签: cocoa-touch uitableview iphone-sdk-3.0 uiviewcontroller


    【解决方案1】:

    我认为您将需要重新架构它。在没有看到所有代码的情况下,我无法 100% 确定,但似乎您在完成 MapViewController 之前就已经摆脱了它。是的,您不再显式使用它,但是您从中拉出的视图几乎可以肯定不会对其视图控制器持有保留(通常控制器保留视图,而不是相反)。因此,当您释放它时,它会释放,现在您刚刚添加的子视图正在引用一个已释放的对象。你可以通过开启 NSZombies 来测试它。

    从单元格中删除它所附加的视图后,您需要释放 MapViewController。您可能应该继承 UITableViewCell 并使 MapViewController 成为该类的 ivar。然后你可以在单元格的dealloc例程中释放它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多