2014-10-20 40 views
5

我读过其他StackOverflow的问题和解答,并了解这是自iOS6(或通过设计,必须释放委托,然后查看,谁知道)以来的错误。我不知道为什么或者没有如何修复。内存泄漏在MapKit iOS8

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前水平?

Memory Usage Before/After MapKit

有别的我失踪?这是预期的行为?有没有内存泄漏判断由配置文件,但显然有些东西是不正确的...

+0

我看到的一样。找到了解决办法? – thejaz 2015-05-15 16:34:20

+1

不!说实话,甚至不应用修改区域上的“修补程序”。 '内存泄漏'(如果它是这样的话)没问题,并且在真实设备上不明显,并且它不会增长,这很好。 – SparkyRobinson 2015-05-16 15:03:26

+1

同意,我注意到它在设备上比在模拟器中好得多。 – thejaz 2015-05-19 21:32:38

回答

1

尽管SO社区使用如此钟爱的MemoryHotFix关于这个问题,你应该确保你没有任何有力的参考。正如其他人所说的,如果您正在使用(读取实例化)视图来保存它们所在的视图控制器的引用,并且将该视图控制器作为对该视图的引用,那么您可能会进入强参考循环。

这种情况可能会阻止您的deinit/dealloc方法,使您的清理变得不必要和无用。

正如documentation说:

您可以通过定义一些弱或无主的引用,而不是强引用类之间的关系,解决很强的参考周期。

所以一定要:

  1. 检查您DEINIT(SWIFT)/ dealloc的实际上是被称为(如果没有,则可能表示很强的参考周期)。
  2. 实际上nil MKMapView和LocalitionManager的委托以及它们自己。

像这样:

self.mapView.delegate = nil 
self.mapView = nil 
self.locationManager?.delegate = nil 
self.locationManager = nil 

证明

有考虑到这一点,这里是有一个VC推另一个VC用的MKMapView一个例子,每一个垂直的红线是指“推新VC“,每条绿线意味着”啪啪啪“:

enter image description here

有一些初始设置(从50 Mb +/-开始),但未来推送不会导致任何内存泄漏,如图所示。值得一提的是,这是使用真实设备捕获的。我也使用模拟器对其进行了测试,尽管初始设置要高得多(从100 Mb开始),但结果仍然是一致的。

希望你们能解决这个问题,你可能会,还有,请检查您的项目强大的参考周期可能危及您的产品在未来;)