我有一个导航控制器,其中 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 上对此进行了测试,在这两种情况下我都发现了这种堆增长。