2014-02-18 17 views
6

Ich habe MKMapView in einem View - Controller und wenn ich anfange zu zoomen auf es verbrauchen viel Speicher und wenn ich die Ansicht, wer enthält die MKMapView der Speicher ist nicht freigegeben (ich benutze ARC in meine App)MKMapView Speicherprobleme in ios7 sdk

bearbeiten:

i in einigen Stapelüberlauf Antworten gelesen, dass ich die MKMapView in AppDelegate setzen müssen:

-(MKMapView*) mapView 
{ 
    if(_mapView == nil) { 
     _mapView = [[MKMapView alloc] init]; 
    } 
    return _mapView; 
} 

und in viewWillDisa ppear von Viewcontroller, der die MKMapView enthält setzen

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

    XAppDelegate.mapView.delegate = nil; 
    [XAppDelegate.mapView removeFromSuperview]; 

} 

aber es hat mein Problem nicht lösen.

+0

Testen am Simulator oder Gerät? – Guilherme

+0

Gerät (ipad air ios 7) –

+1

Es ist eine gute Praxis, eine einzige Instanz in Ihrer App zu haben, solange nur nicht mehr als eine Karte pro Ansicht vorhanden ist. Sie können Speicher sparen, aber das ist nicht obligatorisch. – Guilherme

Antwort

1

Ein häufiger Fehler, den ich gesehen habe, ist, dass das MKOverlay eine starke Referenz auf die MKOverlayView/MKOverlayRender und die MKMapView hält. Dies führt zu einem Retain-Zyklus, da der MKMapView auch einen starken Bezug auf die MKOverlay Instanzen hat.

+1

aber ich habe kein MKOverlay gezeichnet Ich habe nur eine leere Karte und wenn ich anfange zu zoomen verbraucht es viel Speicher –

+0

Karten sind speicherintensiv. Du wirst das nie ändern. Was Sie sicherstellen müssen, ist, dass Sie dieses Speicher zurückfordern können, wenn es freigegeben wird. Im Allgemeinen sollte _nothing_ eine starke Referenz auf eine MKMapView haben, es sei denn, Sie verwenden ein Singleton-Muster. Dies beinhaltet den enthaltenden View-Controller. Es sollte nur beibehalten werden, da es sich um eine Unteransicht Ihrer Stammansicht handelt. Sobald die Root-Ansicht freigegeben ist, sollte es auch sein. – Holly