2014-10-20 48 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開始),但結果仍然是一致的。

希望你們能解決這個問題,你可能會,還有,請檢查您的項目強大的參考週期可能危及您的產品在未來;)