我已经阅读了其他StackOverflow问题和解答,并了解这是一个自iOS6以来的错误(或者设计,必须解除分配代理,然后查看,谁知道)。我不知道为什么或如何修复它。
Anywho,我已经从其他答案中添加了热门修补程序(下面,对于未来的读者):
- (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级别之前?
我还缺少其他什么吗?这是预期的行为吗?分析器判断没有内存泄漏,但显然有些事情是对的......
答案 0 :(得分:1)
尽管SO社区使用了如此受欢迎的MemoryHotFix来解决这个问题,但你应该确定你没有任何强有力的参考。正如其他人所说,如果您正在使用(读取实例化)视图,这些视图包含对它们所在的视图控制器的引用,并且该视图控制器作为对该视图的引用,您可能会进入强引用周期。
这种情况可能会阻止你的deinit / dealloc方法,使你的清理变得不必要和无用。
如documentation中所述:
您可以通过将类之间的某些关系定义为弱引用或无引用而不是强引用来解决强引用循环。
所以一定要:
像这样:
self.mapView.delegate = nil
self.mapView = nil
self.locationManager?.delegate = nil
self.locationManager = nil
<强>证明强>
考虑到这一点,这里有一个例子,其中有一个VC用MKMapView推动另一个VC,每个垂直的红线表示“推新VC”,每个绿线表示“弹出它”:
有一些初始设置(从50 Mb +/-开始),但未来的推送不会导致任何内存泄漏,如图所示。值得一提的是,这是使用真实设备捕获的。我已经使用模拟器对其进行了测试,尽管初始设置要高得多(从100 Mb开始),结果也是如此。
希望你们能解决这个问题,并且你们也可以检查一下你的项目是否存在可能在将来危及你产品的强参考周期;)