addAnnotations kwestie (memory management misschien?)

stemmen
1

Ik heb een probleem met MKMapView / annotaties / UINavigationController. Kortom, ik beheer mijn uitzicht op het gebruik van een UINavigationController; een van mijn weergave bevat een MKMapView en ik aantekeningen op het toevoegen (10 tot 200) met behulp van de addAnnotations methode.

Alles werkt boete behalve één ding: als ik navigeren te snel op mijn UINavigationController, de iPhone simulator crashes, het ontvangen van een EXC BAD ACCESS signaal. Bijvoorbeeld, als ik laad mijn ogen met het MKMapView en meteen druk op de Back knop van de UINavigationController navigatiebalk, krijg ik het signaal. Ik dacht dat het probleem was met de addAnnotations methode: als mijn MKMapView is geladen, ik aantekeningen toe te voegen, maar het lijkt erop dat alles asynchroon wordt gedaan. Als ik wacht als een seconde voordat het indrukken van de knop Terug, krijg ik geen fout, maar als ik te snel, het crasht. Ik krijg geen fout helemaal als ik verwijder de addAnnotations lijn. Ik denk dat het komt omdat mijn opvatting wordt vrijgegeven door de UINavigationController VOOR de addAnnotations methode kreeg de klus te klaren.

Elke goede oplossing voor dit? Ik wil niet dat de gebruiker om te wachten (het weergeven van een laad- uitzicht bijvoorbeeld); Ik denk dat de oplossing is misschien een beter geheugenbeheer zijn, maar ik zie niet hoe ik dit kon doen.

    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); }

Op dit voorbeeld, krijg ik de plaatsmarkeringen toevoegen: gedaan bericht voordat er iets te krijgen op de kaart weergegeven.

De vraag is gesteld op 07/09/2009 om 17:31
bron van user
In andere talen...                            


1 antwoorden

stemmen
5

Ik kwam de zelfde kwestie of bug, en vond een oplossing op een blog post .

U kunt zien of wat je ziet is hetzelfde als de kwestie in de post door te kijken naar de debugger stack trace.

Het probleem is te wijten aan het feit dat de MapViewController (de ouder van het MKMapView) is dealloc'd en de asynchrone kaart ophalen van interne keuken van MKMapView probeert de afgevaardigde van MKMapView (die was MapViewController) noemen.

Dus, op dealloc van MapViewController, je moet het MKMapView.delegate = nul gereset, zodat er geen afgevaardigden zijn vernoemd naar een aantal tegels krijgen teruggekeerd.

UPDATE: Het is een goede gewoonte (het is ergens in het geheugenbeheer docs) tot nul afgevaardigden in dealloc voor het vrijgeven van de gemachtigde houder. Dit zal problemen zoals voorkomen dat dit gebeurt voor langlopende asynchrone taken.

antwoordde op 07/09/2009 om 17:35
bron van user

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