- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个导航 Controller ,其中 VC1 将 VC2 推送到导航堆栈。 VC2 在基于选项卡的 View 中有一个 MKMapView,并打开了用户位置。当我使用 Heapshot 分析工具检查仪器的重复分配时,当我返回 VC1 时,我反复发现一些 MKUserLocation 对象没有被释放。
我已经删除了所有注释并在 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 上对此进行了测试,我发现这两种情况下都有堆增长。
最佳答案
如果您在 IB 中创建 MKMapView
,您应该在 -viewDidUnload
中释放/nil
-ing 它和 -dealloc
。
如果你不这样做,如果你的 View 在你的 View Controller 的生命周期中被卸载/重新加载,你所有的 View 元素(无论如何设置为保留属性)都将在重新加载时泄漏。
网络/SO 上似乎有相当多的讨论说这是 5.0.1 之前的 API 错误。您构建的 SDK 版本是什么?
此外,在黑暗中拍摄:仅尝试
self.mapView.showsUserLocation = NO;
或
self.mapView.showsUserLocation = NO;
[self.mapView.layer removeAllAnimations];
[self.mapView removeAnnotations:self.mapView.annotations];
而不是您现在使用的这些命令的顺序。
可能是您在 MKMapView
有机会正确拆除它之前删除了 MKUserLocation
的注释?
关于ios - MKMapView 没有为 MKUserLocation 释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8746549/
我想知道有没有免费的PL/pgSQL开发环境。 在 Notepad++ 中编写代码,替换函数并运行它会使过程变慢。我目前正在使用 pgAdmin(仅用于替换和运行程序),但这不是我想要的。 我知道这里
我是一名优秀的程序员,十分优秀!