我已经阅读了其他 StackOverflow 问题和解答,并了解这是自 iOS6 以来的一个错误(或按设计,必须取消分配委托(delegate),然后查看,谁知道呢)。我不知道为什么或如何没有修复它。
任何人,我已经从其他答案中添加了修补程序(下面,供 future 的读者使用):
- (void) viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[self applyMapViewMemoryHotFixOnDisappear];
}
- (void)applyMapViewMemoryHotFixOnDisappear{
[self applyMapViewMemoryHotFix];
self.mapView.showsUserLocation = NO;
self.mapView.delegate = nil;
self.locationManager.delegate = nil;
[self.mapView removeFromSuperview];
self.mapView = nil;
}
- (void)applyMapViewMemoryHotFix{
switch (self.mapView.mapType) {
case MKMapTypeHybrid:
{
self.mapView.mapType = MKMapTypeStandard;
}
break;
case MKMapTypeStandard:
{
self.mapView.mapType = MKMapTypeHybrid;
}
break;
default:
break;
}
self.mapView.mapType = MKMapTypeStandard;
}
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
[self applyMapViewMemoryHotFix];
}
但是,我的问题是,为什么内存不会下降到 MapKit 之前的水平?
还有什么我想念的吗?这是预期的行为吗?探查器判断没有内存泄漏,但显然有些地方不对...
最佳答案
尽管 SO 社区使用了如此受欢迎的 MemoryHotFix 来解决这个问题,但您应该确保您没有持有任何强引用。正如其他人所说,如果您正在使用(读取实例化) View ,这些 View 包含对它们所在的 View Controller 的引用,并且该 View Controller 作为对该 View 的引用,您可能会进入强引用循环。
这种情况可能会阻止您的 deinit/dealloc 方法,使您的清理变得不必要和无用。
如 documentation 中所述:
You resolve strong reference cycles by defining some of the relationships between classes as weak or unowned references instead of as strong references.
所以一定要:
- 检查你的 deinit(swift)/dealloc 是否真的被调用了(如果没有,它可能表示一个强引用循环)。
- 实际上没有 MKMapView 和 LocalitionManager 的委托(delegate)以及他们自己。
像这样:
self.mapView.delegate = nil
self.mapView = nil
self.locationManager?.delegate = nil
self.locationManager = nil
证明
考虑到这一点,下面是一个示例,其中一个 VC 使用 MKMapView 推送另一个 VC,每条垂直红线表示“推送新 VC”,每条绿线表示“弹出它”:
有一些初始设置(从 50 Mb +/- 开始),但 future 的推送不会导致任何内存泄漏,如图所示。值得一提的是,这是使用真实设备拍摄的。我也使用模拟器对其进行了测试,尽管初始设置要高得多(从 100 Mb 开始),但结果是一致的。
希望你们能修复它,并且您也可以检查您的项目是否存在可能在未来损害您的产品的强引用循环;)
关于ios - MapKit iOS8 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26463125/