2013-03-15 17 views
6

Ich habe einen einfachen UIViewController erstellt, der eine GMSMapView erstellt und zerstört.Speicherleck in 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 ; 
} 

Ich habe Instrumente mit dem Allocations Instrument verwendet. Der Test ist einfach. Drücken Sie in einem UINavigation ViewController auf die Ansicht, drücken Sie zurück und wiederholen Sie die Aktion. Jedes Mal, wenn Sie die Ansicht, die die oben beschriebene GMSMapView enthält, drücken und loslassen, gibt es ungefähr 40 kb undicht. Ich habe einen Screenshot von den Instrumenten, um dies zu veranschaulichen, aber stackoverflow erlaubt es mir nicht, es zu posten. Ich kann bei Interesse per E-Mail an jemanden senden.

Mache ich etwas falsch oder verpasse etwas?

+0

Warum brauchen Sie jedes Mal, um 'GMSMapView' neu zu erstellen? –

+0

Jede Chance, m_mapView.delegate = nil; vor dem sagen m_mapView = nil wird es lösen? Es kann ... –

+0

@SergeyKuryanov Im Grunde um Speicher zu befreien. Jede GMSMapView verbraucht etwas ernsthaften Speicher. Ich habe eine Mini-Ansicht (die Hälfte des Bildschirms) und eine Schaltfläche fährt Sie, um eine maximierte Version zu sehen. Wenn ich von der maximierten Version zurückkehre, möchte ich sie wegwerfen. – user2101384

Antwort

2

Was für mich gearbeitet wurde das Entfernen der @try Klausel I in dealloc hatte:

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

war meine Absicht self als Beobachter zu entfernen, wenn die Viewcontroller dealloc'd wird (ironischerweise ein Speicherproblem zu vermeiden), und Ignoriere die Ausnahme, wenn es kein Beobachter ist.

Scheinbar @try behält irgendwie die mapView, die es im Speicher (über ARC) bleibt. Sehen Sie warum hier: Why does "try catch" in Objective-C cause memory leak?.

Nach dem Entfernen @try Klausel (und die removeObserver mit einigen Flag, um die Ausnahme zu vermeiden), ging der Speicher wieder normal zu verhalten!