addAnnotations problém (správa paměti možná?)

hlasů
1

Mám nějaký problém s MKMapView / anotací / UINavigationController. V podstatě, i řídit mé názory pomocí UINavigationController; jeden z mého pohledu obsahuje MKMapView a já přidat poznámky o tom (10 až 200) pomocí metody addAnnotations.

Vše je v pořádku až na jednu věc: pokud i navigovat „příliš rychle“ na mém UINavigationController, zhroutí iPhone simulátoru, který je příjemcem „špatný přístup EXC“ signál. Například, pokud jsem nahrát svůj názor obsahující MKMapView a ihned stiskněte tlačítko „Zpět“ z UINavigationController navigačním panelu, i dostat signál. Myslel jsem si, že problém byl s metodou addAnnotations: pokud je vložen můj MKMapView, i přidat poznámky k němu, ale vypadá to, že vše, co se děje asynchronně. Pokud se i čekat jako druhý před stisknutím tlačítka „Zpět“, jsem si žádnou chybu, ale pokud jsem příliš rychle, došlo ke zhroucení. Mám žádná chyba vůbec, pokud i odstranit addAnnotations linku. Myslím, že je to proto, že můj názor je propuštěn UINavigationController před metodu addAnnotations dostal práci.

Každá dobrá řešení tohoto problému? Nechci, aby uživatel čekat (zobrazení zaváděcí pohled například); Myslím, že řešením by mohlo být lepší správu paměti, ale já nechápu, jak jsem mohl udělat.

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

Na tomto příkladu je i dostat „Pomocí značky: done“ message před vším dostat zobrazí na mapě.

Položena 07/09/2009 v 17:31
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
5

Narazil jsem na stejné téma, nebo chyby, a našel řešení na blogu .

Můžete zjistit, zda to, co vidíte, je stejný jako vydání na postu prohlédnutím trasování debugger zásobníku.

Tato otázka je kvůli skutečnosti MapViewController (rodič MKMapView) byl dealloc'd a asynchronní mapa načítání vnitřní části MKMapView se pokouší volat delegáta MKMapView (což bylo MapViewController).

Takže na dealloc z MapViewController, máte resetovat MKMapView.delegate = nil, takže žádné delegáti se nazývají po některé dlaždice dostat se vrátil.

UPDATE: je to dobré praxe (je to někde v správy paměti dokumentů) na nulových delegátů dealloc před uvolněním držáku delegáta. To se zastaví problémy, jako se to nestalo dlouho běžící async úkoly.

Odpovězeno 07/09/2009 v 17:35
zdroj uživatelem

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