ios - Остановить iOS 7 MKMapView от утечки памяти




2 Answers

Я столкнулся с той же проблемой и (благодаря Stackoverflow) исправил ее, изменив MKMapType в viewWillDisappear и освободив / установив свой делегат на nil.As он по-прежнему отправляет сообщение делегатам. Это описано в MKMapViewDelegate Protocol Reference:

Перед выпуском объекта 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;
}

надеюсь это поможет

Я заметил, что мое приложение теряет память, но если я возьму MKMapView , проблема с памятью исчезнет.

Чтобы проверить теорию, я сделал простой проект, который имеет представление, которое подталкивает представление с помощью MKMapView в нем и выскакивает и толкает. Больше ничего. Никакого кода в контроллерах просмотра, все, что сделано через раскадровку.

Если я перехожу назад и вперед к виду карты, он начинается примерно с 3 МБ после того, как вы нажимаете и выталкиваете представление с картой в нем, примерно в 15 раз память составляет около 230 МБ.

Кто-нибудь еще видел это? Кажется, это довольно большая ошибка. Есть ли другой способ использования MKMapView , который предотвратит его утечку?




Лучшее решение, которое я нашел, - иметь экземпляр 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];
    }
}



Related

ios objective-c memory-management memory-leaks mkmapview