4

我有一个导航控制器,其中 VC1 将 VC2 推送到导航堆栈上。VC2 在基于选项卡的视图中有一个 MKMapView,并打开了用户位置。当我使用 Heapshot Analysis 工具检查仪器的重复分配时,我反复发现一些 MKUserLocation 对象在我回到 VC1 时没有被释放。 在此处输入图像描述

我已经删除了所有注释,并且在 dealloc 时也禁用了用户位置。这种堆增长的原因可能是什么?

将 VC2 推入导航堆栈的 VC1 代码:

- (NSIndexPath *)tableView:(UITableView *)tableView 
  willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    VC2 *vc2 = [[VC2 alloc] init];
    vc2.index = indexPath.row;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[self navigationController] pushViewController:vc2 
                                           animated:YES];
    [vc2 release];
    vc2 = nil;
    return nil;
}

VC2中的dealloc代码:

- (void)dealloc {
//Other UILabel, UITextField objects dealloc methods go here
//The next four lines of code do not make a difference even if they are in viewWillDisappear
[self.mapView removeAnnotations:self.mapView.annotations];
[self.mapView.layer removeAllAnimations];
self.mapView.showsUserLocation = NO;//This line does not make a difference in heapshot
mapView.delegate = nil;
[mapView release];
mapView = nil;
[super dealloc];

}

此外,如果我不打开用户位置,也没有堆增长。

更新:我在模拟器和 iPad 3G+WiFi 上对此进行了测试,在这两种情况下我都发现了这种堆增长。

4

1 回答 1

5

如果你MKMapView在 IB 中创建,你应该在AND中释放/ nil-ing它。-viewDidUnload-dealloc

如果您不这样做,如果您的视图在视图控制器的生命周期内被卸载/重新加载,那么您的所有视图元素(无论如何都设置为保留属性)将在重新加载时泄漏。

网络/SO 上似乎有相当数量的喋喋不休说这是 5.0.1 之前的 API 错误。您构建的 SDK 版本是什么?

此外,在黑暗中拍摄:仅尝试

self.mapView.showsUserLocation = NO;

或者

self.mapView.showsUserLocation = NO;
[self.mapView.layer removeAllAnimations];
[self.mapView removeAnnotations:self.mapView.annotations];

而不是您现在使用的这些命令的顺序。

可能是您MKUserLocation之前删除了注释,MKMapView有机会正确地将其拆除?

于 2012-01-17T09:22:13.417 回答