2013-11-22 84 views
27

我注意到我的應用程序泄漏內存,但如果我採取MKMapView出內存問題消失。停止從泄漏內存的iOS 7 MKMapView

爲了測試這個理論,我做了一個簡單的死了的項目,其中有一個視圖,其中有一個MKMapView視圖,並彈出並推送。而已。在視圖控制器中沒有代碼,通過故事板完成。

如果我來回地圖視圖,在推入視圖並彈出視圖後,視圖啓動大約3MB,大約15倍內存大約230MB。

任何人看到這個?看起來像一個很大的錯誤。有沒有其他方法可以使用MKMapView來防止泄漏?

enter image description here

+2

我在我的應用程序中看到了這種行爲,對於我來說問題很明確:這裏發生了什麼?這是一個真正的內存泄漏(似乎是這樣),並有人找出了什麼是錯的,以及如何解決。 –

+0

嘗試在viewDidDisappear方法中移除MKMapView,例如:[self.outMapView removeFromSuperview]; self.outMapView = nil; –

+0

可能應該記錄一張雷達票。 – johndpope

回答

12

我面臨着同樣的問題,(感謝#1)在viewWillDisappear和釋放改變MKMapType /其委託設置爲nil.As它仍然發送消息,代表固定它。 這是記錄在MKMapViewDelegate協議參考:

之前釋放您已設置了 委託的對象的MKMapView,記得給該對象的委託屬性設置爲nil。你可以這樣做一個 地方是在你處置 地圖視圖

dealloc方法。

-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
    [self applyMapViewMemoryFix]; 

} 

- (void)applyMapViewMemoryFix{ 

switch (self.mkMapView.mapType) { 
    case MKMapTypeHybrid: 
    { 
     self.mkMapView.mapType = MKMapTypeStandard; 
    } 

     break; 
    case MKMapTypeStandard: 
    { 
     self.mkMapView.mapType = MKMapTypeHybrid; 
    } 

     break; 
    default: 
     break; 
} 
self.mkMapView.showsUserLocation = NO; 
self.mkMapView.delegate = nil; 
[self.mkMapView removeFromSuperview]; 
self.mkMapView = nil; 
} 

希望這有助於

+5

沒有幫助。仍在泄漏。 – durazno

+0

是的,它也在泄漏我。我有一個'UICollcetionViewCell'中的地圖視圖,所以我不能從'viewWillDisappear'調用這段代碼。在單元的'deinit'中調用它不起作用。 – fruitcoder

+1

我們有任何更新嗎?其2018年仍然漏水。@durazno – dreamBegin

3

斯威夫特版本:

override func viewWillDisappear(animated:Bool){ 
    super.viewWillDisappear(animated) 
    self.applyMapViewMemoryFix() 
} 

func applyMapViewMemoryFix(){ 
    switch (self.mapView.mapType) { 
     case MKMapType.Hybrid: 
      self.mapView.mapType = MKMapType.Standard 
      break; 
     case MKMapType.Standard: 
      self.mapView.mapType = MKMapType.Hybrid 
      break; 
     default: 
      break; 
    } 
    self.mapView.showsUserLocation = false 
    self.mapView.delegate = nil 
    self.mapView.removeFromSuperview() 
    self.mapView = nil 
} 
+2

儘管我實現了您的解決方案,但我仍然在iOS 8.3/8.4中遇到內存問題 – user2722667

3

我已經找到了最好的解決辦法是在你的委託一個的MKMapView的情況下,你會分配它只有一次。

然後任何時候你需要一個MapView,你只需使用委託中的一個。

在我的情況下,只要視圖將會消失(在地圖上沒有較舊的註釋),我需要從中清除註釋。

- (void)viewDidLoad { 
     AppDelegate *delegate = [UIApplication sharedApplication].delegate; 
      if (!delegate.appModel.mapView) 
      delegate.appModel.mapView = [[MKMapView alloc] initWithFrame:self.view.frame]; 
     self.mapView = delegate.appModel.mapView; 
     [self.mapView setFrame:self.view.frame]; 
     [self.mapView setDelegate:self]; 
     [self.view addSubview:self.mapView]; 
    } 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.mapView removeAnnotations:self.mapView.annotations]; 
    for (id<MKOverlay> overlay in self.mapView.overlays) { 
     [self.mapView removeOverlay:overlay]; 
    } 
} 
+0

靜態變量會執行(而不是將其存儲在應用程序委託變量中) –