2013-03-15 7 views
6

Я создал простой UIViewController, который создает и уничтожает GMSMapView.утечка памяти в GMSMapView

- (void)viewDidAppear:(BOOL)animated 
{ 
    if (!m_disappearing_bc_segue) 
    { 
     [super viewDidAppear:animated] ; 

     GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude: self.location.latitude 
                  longitude: self.location.longitude 
                   zoom:9 ] ; 

     m_mapView = [GMSMapView mapWithFrame:CGRectMake(0, 0, 320, 420) camera:camera]; 

     m_mapView.myLocationEnabled = NO ; 

     [m_mapView setMapType: kGMSTypeTerrain] ; 

     m_mapView.delegate = self ; 

     [self.view addSubview:m_mapView] ; 
     [self.view sendSubviewToBack:m_mapView] ; 
} 



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

    [m_mapView clear] ; 
    [m_mapView stopRendering] ; 
    [m_mapView removeFromSuperview] ; 
    m_mapView = nil ; 
} 

Я использовал инструменты с инструментом Allocations. Тест прост. В UINavigation ViewController нажмите вид, нажмите и повторите. Каждый раз, когда вы нажимаете и выставляете представление, содержащее GMSMapView, существует около 40kb утечек. У меня есть скриншот из инструментов, чтобы проиллюстрировать это, но stackoverflow не позволяет мне публиковать его. Если я заинтересован, я могу отправить кого-то по электронной почте.

Я делаю что-то неправильно или что-то пропускаю?

+0

Зачем вам каждый раз воссоздавать 'GMSMapView'? –

+0

Любые шансы добавить m_mapView.delegate = nil; перед тем как сказать m_mapView = nil решит его? Это может ... –

+0

@SergeyKuryanov В принципе, чтобы освободить память. Каждый GMSMapView потребляет серьезную память. У меня есть мини-просмотр (половина экрана), и кнопка приводит вас к максимальной версии. Когда я вернусь из максимизированной версии, я хочу ее выбросить. – user2101384

ответ

2

То, что сработало для меня был снятие оговорки @try я имел в dealloc:

@try { 
    [self.mapView removeObserver:self forKeyPath:@"myLocation"]; 
} 
@catch (NSException *exception) { 
} 

Мое намерение состояло в том, чтобы удалить self в качестве наблюдателя, когда ViewController является dealloc'd (по иронии судьбы, чтобы избежать проблем памяти), и игнорируйте исключение, если оно не является наблюдателем.

По-видимому @try как-то сохраняет mapView, что делает его пребывание в памяти (через ARC). Смотрите, почему здесь: Why does "try catch" in Objective-C cause memory leak?.

После удаления @try пункт (и кондиционирование removeObserver с некоторым флагом, чтобы избежать исключения), память вернулась, чтобы вести себя нормально!