Problema al agregar varias anotaciones al mapa

votos
1

Ok, entonces estoy teniendo este problema Lo que quiero hacer es agregar manualmente varias anotaciones a un mapa. Cuando agrego solo una anotación, funciona sin problemas. El pin se cae, puede hacer clic en él para ver su rótulo, la vida es buena.

El problema viene cuando quiero agregar más de uno. Cuando agrego el segundo, de repente los pines no están coloreados correctamente (es decir, dependiendo de su magnitud deben ser de un cierto color, pero ahora son los dos iguales ...), y más importante cuando se hace clic en ellos, para ver su llamada, la aplicación se bloquea con exex_bad_access. Realmente no tengo idea de lo que está mal, ¿tal vez estoy agregando demasiadas vistas al mapa? Pero son solo 9 pines y los pines en sí mismos se agregan bien. Aquí está mi código ...

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

incluso intentó eliminar la segunda función, pero no hizo nada.

¡Gracias por la ayuda! PD: También debería agregar, generalmente hay uno o dos pines de los 9 que funcionan cuando haces clic en la anotación ...

Si incluso intento manualmente anotar dos anotaciones a mano en el programa (es decir, eliminar el ciclo), sigue fallando y el color sigue siendo incorrecto ...

Publicado el 17/08/2009 a las 18:49
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
1

Parece que su gestión de memoria de la stopsvariable es incorrecta. Asignas una matriz mutable, luego reemplazas la matriz con el valor de retorno de -[Bus returnStops], y luego la liberas. Además, no está claro qué está sucediendo bus2- ¿ -[Bus initWithStop:]devuelve una instancia diferente de Bus? No es habitual enviar ningún método -init*a un objeto ya inicializado. Creo que probablemente esté confundido por las convenciones de administración de memoria en Cocoa Touch. Aquí hay una colección de artículos y otras referencias sobre el manejo de la memoria Cocoa (que es la misma bestia).

Respondida el 17/08/2009 a las 18:55
fuente por usuario

votos
0

Así que la respuesta fue que seguí enviando bus1 el objeto init, por lo que se confundió.

"Hola David,

Su modelo de datos se ve como una manguera para mí. Solo tiene un objeto de bus al que envía repetidamente initWithStop: to.

Espero que esto ayude.

¡Buena suerte! "

¡Gracias chicos por su ayuda! ¡Todos me ayudaron bastante!

Respondida el 17/08/2009 a las 20:02
fuente por usuario

votos
0

No lo llamaría un problema de administración de memoria; solo diría que está utilizando referencias de matriz incorrectamente.

Después de construir la matriz con NSMutableArray * stops = [[NSMutableArray alloc] init], el siguiente paso es usar [stops addObject:] para agregar cada parada que desee almacenar.

¿Después de esto? No está claro lo que realmente estás tratando de hacer.

Respondida el 17/08/2009 a las 19:34
fuente por usuario

votos
0

¿Has probado usar AddAnnotations en lugar de agregar anotaciones? - (void) addAnnotations: (NSArray *) anotaciones. Esto podría funcionar para usted ... pero mirando la respuesta anterior e inspeccionando más a fondo, está teniendo problemas de administración de memoria en su viewDidLoad (aunque podría no ser la causa de su problema, pero podría ser). El primero de ustedes asigna la matriz (se detiene) y luego la reemplaza con una matriz en el objeto Bus, esto causará una fuga. También estás liberando esa matriz que podría estar causando la falla, ya que estás liberando la matriz que está realmente en el objeto Bus sin haber aumentado la cantidad de referencias a ella. No estoy seguro de qué es lo que initWithStop está haciendo, pero también podría estar obteniendo una fuga si initWithStop conserva el objeto.

Respondida el 17/08/2009 a las 18:56
fuente por usuario

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