我注意到我的應用程序泄漏內存,但如果我採取MKMapView
出內存問題消失。停止從泄漏內存的iOS 7 MKMapView
爲了測試這個理論,我做了一個簡單的死了的項目,其中有一個視圖,其中有一個MKMapView
視圖,並彈出並推送。而已。在視圖控制器中沒有代碼,通過故事板完成。
如果我來回地圖視圖,在推入視圖並彈出視圖後,視圖啓動大約3MB,大約15倍內存大約230MB。
任何人看到這個?看起來像一個很大的錯誤。有沒有其他方法可以使用MKMapView
來防止泄漏?
我注意到我的應用程序泄漏內存,但如果我採取MKMapView
出內存問題消失。停止從泄漏內存的iOS 7 MKMapView
爲了測試這個理論,我做了一個簡單的死了的項目,其中有一個視圖,其中有一個MKMapView
視圖,並彈出並推送。而已。在視圖控制器中沒有代碼,通過故事板完成。
如果我來回地圖視圖,在推入視圖並彈出視圖後,視圖啓動大約3MB,大約15倍內存大約230MB。
任何人看到這個?看起來像一個很大的錯誤。有沒有其他方法可以使用MKMapView
來防止泄漏?
我面臨着同樣的問題,(感謝#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;
}
希望這有助於
沒有幫助。仍在泄漏。 – durazno
是的,它也在泄漏我。我有一個'UICollcetionViewCell'中的地圖視圖,所以我不能從'viewWillDisappear'調用這段代碼。在單元的'deinit'中調用它不起作用。 – fruitcoder
我們有任何更新嗎?其2018年仍然漏水。@durazno – dreamBegin
斯威夫特版本:
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
}
儘管我實現了您的解決方案,但我仍然在iOS 8.3/8.4中遇到內存問題 – user2722667
我已經找到了最好的解決辦法是在你的委託一個的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];
}
}
靜態變量會執行(而不是將其存儲在應用程序委託變量中) –
我在我的應用程序中看到了這種行爲,對於我來說問題很明確:這裏發生了什麼?這是一個真正的內存泄漏(似乎是這樣),並有人找出了什麼是錯的,以及如何解決。 –
嘗試在viewDidDisappear方法中移除MKMapView,例如:[self.outMapView removeFromSuperview]; self.outMapView = nil; –
可能應該記錄一張雷達票。 – johndpope