MKMapView не освобождает память для MKUserLocation - PullRequest
4 голосов
/ 05 января 2012

У меня есть контроллер навигации, в котором VC1 помещает VC2 в стек навигации. VC2 имеет MKMapView в представлении на основе вкладок с включенным местоположением пользователя. Когда я проверяю повторное выделение с помощью инструментов, используя инструмент Heapshot Analysis, я неоднократно обнаруживаю, что некоторые объекты MKUserLocation не освобождаются, когда я возвращаюсь в VC1. enter image description here

Я удалил все аннотации, а также отключил местоположение пользователя при разлочке. Что может быть причиной такого роста кучи?

Код VC1, который помещает VC2 в стек навигации:

- (NSIndexPath *)tableView:(UITableView *)tableView 
  willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    VC2 *vc2 = [[VC2 alloc] init];
    vc2.index = indexPath.row;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [[self navigationController] pushViewController:vc2 
                                           animated:YES];
    [vc2 release];
    vc2 = nil;
    return nil;
}

Код деаллока в VC2:

- (void)dealloc {
//Other UILabel, UITextField objects dealloc methods go here
//The next four lines of code do not make a difference even if they are in viewWillDisappear
[self.mapView removeAnnotations:self.mapView.annotations];
[self.mapView.layer removeAllAnimations];
self.mapView.showsUserLocation = NO;//This line does not make a difference in heapshot
mapView.delegate = nil;
[mapView release];
mapView = nil;
[super dealloc];

}

Также, если я не включаю местоположение пользователя, рост кучи не происходит.

Обновление: Я проверил это на симуляторе и на iPad 3G + WiFi, и я нахожу этот рост кучи в обоих случаях.

1 Ответ

5 голосов
/ 17 января 2012

Если вы создаете MKMapView в IB, вы должны выпустить / nil -ing его в -viewDidUnload AND -dealloc.

Если вы этого не сделаете, если ваше представление выгружается / перезагружается в течение срока службы контроллера представления, все элементы представления (которые в любом случае настроены как сохраненные свойства) будут пропущены при перезагрузке.

Кажется, в сети / SO есть немало болтовни о том, что это была ошибка API до 5.0.1. Против какой версии SDK вы строите?

Кроме того, выстрел в темноте: попробуйте только

self.mapView.showsUserLocation = NO;

или

self.mapView.showsUserLocation = NO;
[self.mapView.layer removeAllAnimations];
[self.mapView removeAnnotations:self.mapView.annotations];

вместо порядка этих команд, которые вы используете сейчас.

Может быть, вы удаляете аннотацию для MKUserLocation до того, как MKMapView сможет правильно ее разорвать?

...