Domanda

Ok, quindi sto avendo questo problema. Quello che voglio fare è aggiungere manualmente più annotazioni a una mappa. Quando aggiungo solo un'annotazione, funziona perfettamente. Il perno gocce, è possibile fare clic su di esso per vedere il suo richiamo, la vita è buona.

Il problema nasce quando voglio aggiungere più di uno. Quando aggiungo il secondo, improvvisamente il perno di non sono colorati in modo corretto (cioè a seconda della loro grandezza che dovrebbe essere un certo colore, ma sono ora entrambi lo stesso ...), e ancora più importante quando si fa clic su di essi, per vedere i loro callout, l'applicazione si blocca con exex_bad_access. Io davvero ho idea di cosa c'è che non va, forse sto aggiungere troppe viste alla mappa? Ma è solo 9 perni ed i perni si aggiungono più che bene. Ecco il mio codice ...

    - (void)viewDidLoad {
    [super viewDidLoad];
    NSMutableArray *stops = [[NSMutableArray alloc] init];  //Get list of all the stops available
    Bus *bus1 = [[Bus alloc] init];                         // Bus 1 holds the stops
    stops = [bus1 returnStops];
    for (NSString *stop in stops)                           //Go through each stop to add annotation to map
    {
        Bus *bus2 = [bus1 initWithStop:stop];                //Create an instance of bus with a given stop
        MapAnnotation *eqAnn = [MapAnnotation annotationWithBus:bus2]; 
        [self.mapView addAnnotation:eqAnn];                    //Add the annotation to the map
        //[eqAnn release];
        //[bus2 release];
    }
    [self recenterMap];
    [stops release];

}
- (MKAnnotationView *)mapView:(MKMapView *)mapView 
            viewForAnnotation:(id <MKAnnotation>)annotation {
    MKAnnotationView *view = nil;
    if(annotation != mapView.userLocation) {
        MapAnnotation *eqAnn = (MapAnnotation*)annotation;
        view = [self.mapView dequeueReusableAnnotationViewWithIdentifier:@"busLoc"];
        if(nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:eqAnn
                                                    reuseIdentifier:@"busLoc"] autorelease];
        }
        CGFloat magnituide = [eqAnn.bus.magnitude floatValue];

        if(magnituide >= .80f) {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorRed];
        } else if(magnituide >= .60f) {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorPurple];
        } else 
        {
            [(MKPinAnnotationView *)view setPinColor:MKPinAnnotationColorGreen];
        }
        [(MKPinAnnotationView *)view setAnimatesDrop:YES];
        [view setCanShowCallout:YES];
    } 

    return view;
}

provato anche la rimozione della seconda funzione, ma non ha fatto nulla.

Grazie per l'aiuto! P.S Vorrei anche aggiungere, di solito c'è uno o due perni dei 9 che funziona quando si fa clic l'annotazione ...

Se ho nemmeno provato a manualmente solo due annotazioni a mano nel programma (vale a dire, rimuovere il loop), non riesce ancora ed il colore è ancora sbagliata ...

È stato utile?

Soluzione 4

Quindi la risposta è stata che ho mantenuto l'invio bus1 l'oggetto init, quindi è un po 'confusa.

"Ciao David,

Il modello di dati sembra hosed a me. Hai solo un oggetto bus che si sta inviando ripetutamente initWithStop:. A

Spero che questo aiuti.

In bocca al lupo! "

Grazie ragazzi per il vostro aiuto! Voi tutti mi ha aiutato un po '!

Altri suggerimenti

Sembrerebbe che la gestione della memoria della variabile stops non è corretto. Allocare una matrice mutevole, quindi sostituire tale matrice con il valore restituito di -[Bus returnStops], quindi rilasciare questo. Inoltre non è chiaro cosa sta succedendo con bus2 - fa -[Bus initWithStop:] restituire un diverso istanza di Bus? Non è usuale per inviare qualsiasi metodo -init* su un oggetto già inizializzato. Penso che probabilmente siete confusi dalle convenzioni di gestione della memoria a Cocoa Touch. Ecco una raccolta di articoli e altri riferimenti sulla gestione della memoria di cacao (che è la stessa bestia).

Hai provato a usare AddAnnotations invece di aggiungere annotazioni? - (nulli) addAnnotations: (*) NSArray annotazioni. Questo potrebbe funzionare per voi ... ma guardando la risposta di cui sopra e un'ulteriore ispezione si stanno avendo alcuni problemi di managment di memoria nel viewDidLoad (anche se Thi s potrebbe non essere la causa del problema, ma potrebbe essere). Innanzitutto si assegnano matrice (fermate) e poi ovveriding con alcune serie nell'oggetto Bus, ciò causerà una perdita. Inoltre si sono poi rilasciando tale matrice che potrebbe causare l'arresto poiché si stanno rilasciando matrice che è in realtà nell'oggetto Bus w ithout aver aumentato un conteggio di riferimenti ad esso. Non sono sicuro di quello che sta facendo initWithStop ma si potrebbe essere sempre una perdita anche qui se initWithStop mantiene l'oggetto.

Io non lo definirei un problema di gestione della memoria - Vorrei solo dire che si sta utilizzando riferimenti ad array in modo non corretto

.

Dopo aver costruito l'array con NSMutableArray * ferma = [[NSMutableArray alloc] init], il passo successivo è quello di utilizzare [ferma addObject:]. Aggiungere ogni fermata si desidera memorizzare

Dopo di che? Non è chiaro cosa si sta realmente cercando di fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top