Problème ajouter plusieurs annotations à la carte

voix
1

Ok, je suis tellement avoir ce problème. Ce que je veux faire est d'ajouter manuellement plusieurs annotations à une carte. Quand je viens d'ajouter une annotation, il fonctionne parfaitement. Les gouttes de broches, vous pouvez cliquer dessus pour voir sa légende, la vie est bonne.

Le problème vient quand je veux ajouter plus d'un. Quand j'ajoute le second, tout à coup de la broche ne sont pas correctement colorés (c.-à-selon leur importance, ils devraient être une certaine couleur, mais ils sont maintenant à la fois la même ...), et surtout lorsque vous cliquez dessus, pour voir leur callout, l'application se bloque avec exex_bad_access. Je ne sais vraiment pas ce qui ne va pas, peut-être j'ajouter trop de vues à la carte? Mais il est seulement 9 broches et les broches s'ajouter très bien. Voici mon code ...

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

même essayé d'enlever la deuxième fonction, mais il n'a rien fait.

Merci pour l'aide! PS Je dois aussi ajouter, il y a habituellement une ou deux broches des 9 qui fonctionne lorsque vous cliquez sur l'annotation ...

Si je tente même que deux annotations à la main manuellement dans le programme (c.-à enlever la boucle), il échoue encore et la couleur est encore mal ...

Créé 17/08/2009 à 18:49
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
1

Il semblerait que votre gestion de la mémoire de la stopsvariable est incorrecte. Vous allouez un tableau mutable, puis remplacer ce tableau avec la valeur de retour -[Bus returnStops], puis relâchez cela. En outre , il est pas clair ce qui se passe avec bus2- ne -[Bus initWithStop:]renvoie une autre instance de Bus? Il est pas habituel d'envoyer une méthode -init*sur un objet déjà initialisés. Je pense que vous êtes probablement confus par les conventions de gestion de la mémoire dans Cocoa Touch. Voici une collection d'articles et d' autres références sur la gestion de la mémoire Cocoa (qui est la même bête).

Créé 17/08/2009 à 18:55
source utilisateur

voix
0

La réponse est que je continuais d'envoyer bus1 l'objet init, il est embrouillé.

"Salut David,

Votre modèle de données semble me aspergé. Vous avez seulement un objet de bus que vous envoyez à plusieurs reprises initWithStop: à.

J'espère que cela t'aides.

Bonne chance! "

Merci les gars pour votre aide! Vous me aidé un peu!

Créé 17/08/2009 à 20:02
source utilisateur

voix
0

Je ne parlerais pas d'un problème de gestion de la mémoire - je dirais simplement que vous utilisez des références de tableau de manière incorrecte.

Après la construction du tableau avec NSMutableArray * = arrêt [[NSMutableArray alloc] init], l'étape suivante consiste à utiliser [arrête addObject:] pour ajouter chaque arrêt vous voulez stocker.

Après ça? Il est clair pas ce que vous essayez vraiment de faire.

Créé 17/08/2009 à 19:34
source utilisateur

voix
0

Avez-vous essayé d'utiliser AddAnnotations au lieu d'ajouter une annotation? - (void) addAnnotations: (NSArray *) annotations. Cela pourrait fonctionner pour vous ... mais en regardant la réponse ci-dessus et l'inspection plus vous rencontrez des problèmes de gestion de la mémoire dans votre viewDidLoad (si thi s pourrait ne pas être la cause de votre problème, mais il pourrait être). D'abord vous allouez le tableau (arrêts) et ovveriding ensuite avec une matrice dans l'objet de bus, cela provoquera une fuite. vous aussi relâchant ensuite ce tableau qui pourrait être à l'origine du crash puisque vous publiez le tableau qui est en fait dans l'objet de bus ayant augmenté S ans un nombre de référence. Je ne suis pas sûr de ce que initWithStop fait, mais vous pourriez être obtenir une fuite ici aussi si initWithStop conserve l'objet.

Créé 17/08/2009 à 18:56
source utilisateur

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