addAnnotations problemet (minnehåndtering kanskje?)

stemmer
1

Jeg har noen problem med MKMapView / merknader / UINavigationController. I utgangspunktet, jeg klarer mine synspunkter ved hjelp av en UINavigationController; en av min inneholder en MKMapView og jeg legge merknader på den (10 og 200) ved hjelp av addAnnotations metode.

Alt fungerer fint bortsett fra én ting: Hvis jeg navigere for fort på min UINavigationController, iPhone simulator krasjer, får en EXC BAD ACCESS signal. For eksempel, hvis jeg legger mitt syn inneholder MKMapView og gjenoppbygger trykk på Back -knappen fra UINavigationController navigasjonslinjen, jeg får signal. Jeg skjønte at problemet var med addAnnotations metode: når min MKMapView er lastet, jeg legge til kommentarer til det, men det ser ut som alt er gjort asynkront. Hvis jeg vente som et sekund før å trykke på Tilbake -knappen, jeg får ingen feil, men hvis jeg er for fort, det krasjer. Jeg får ingen feil i det hele tatt hvis jeg fjerner addAnnotations linje. Jeg antar det er fordi min oppfatning er utgitt av UINavigationController FØR addAnnotations metoden fikk jobben gjort.

Enhver god løsning på dette? Jeg ønsker ikke brukeren å vente (som viser en laste visning for eksempel); Jeg antar at løsningen kan være en bedre minnehåndtering, men jeg ser ikke hvordan jeg kunne gjøre dette.

    if(DEBUG_MODE) { NSLog(@Creating array of placemarks : begin); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
    [self.placemarkCache addObject:currentPlacemark];
    [currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@Creating array of placemarks : done); }
if(DEBUG_MODE) { NSLog(@Adding placemarks : begin); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@Adding placemarks : done); }

På dette eksempelet jeg få Legge til stedsmarkeringene: gjort melding før noe blir vist på kartet.

Publisert på 07/09/2009 klokken 16:31
kilden bruker
På andre språk...                            


1 svar

stemmer
5

Jeg løp inn i det samme problemet eller feilen, og fant en løsning på et blogginnlegg .

Du kan se om det du ser er det samme som problemet i innlegget ved å se på debugger stakksporingen.

Problemet skyldes det faktum at MapViewController (den overordnede av MKMapView) er dealloc'd og async kartet til å hente innvendige av MKMapView prøver å ringe representanten fra MKMapView (som var MapViewController).

Så, på dealloc av MapViewController, så må du nullstille MKMapView.delegate = null, slik at ingen delegater kalles etter noen fliser bli returnert.

OPPDATERING: Det er god praksis (det er et sted i minnehåndtering docs) til null delegater i dealloc før du slipper representanten holderen. Dette vil stoppe problemer som dette skjer for lang kjøre async oppgaver.

Svarte 07/09/2009 kl. 16:35
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more