Pergunta

OK, então estou tendo esse problema. O que eu quero fazer é adicionar manualmente várias anotações a um mapa. Quando adiciono apenas uma anotação, funciona perfeitamente. O pino cai, você pode clicar nele para ver sua destaque, a vida é boa.

O problema vem quando eu quero adicionar mais de um. Quando adiciono o segundo, de repente os pinos não são coloridos corretamente (ou seja, dependendo da magnitude deles, eles devem ser de uma certa cor, mas agora ambos são iguais ...) e, mais importante, quando você clica neles, para ver o seu Chamada, o aplicativo trava com exex_bad_access. Eu realmente não tenho ideia do que há de errado, talvez eu esteja adicionando muitas visualizações ao mapa? Mas são apenas 9 pinos e os próprios pinos adicionam muito bem. Aqui está o meu 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;
}

até tentou remover a segunda função, mas não fez nada.

Obrigado pela ajuda! PS Eu também devo acrescentar, geralmente há um ou dois pinos dos 9 que funcionam quando você clica na anotação…

Se eu até tentar manualmente apenas duas anotações manualmente no programa (ou seja, remover o loop), ele ainda falha e a cor ainda está errada ...

Foi útil?

Solução 4

Então, a resposta foi que eu continuava enviando o objeto BUS1, por isso ficou confuso.

"Olá David,

Seu modelo de dados me parece manifestado. Você tem apenas um objeto de ônibus que está enviando repetidamente InitWithStop: para.

Espero que isto ajude.

Boa sorte! "

Obrigado rapazes por sua ajuda! Todos vocês me ajudaram bastante!

Outras dicas

Parece que seu gerenciamento de memória do stops A variável está incorreta. Você aloca uma matriz mutável e substitui essa matriz pelo valor de retorno de -[Bus returnStops], então solte isso. Também não está claro o que está acontecendo com bus2 - faz -[Bus initWithStop:] retornar a diferente instancia de Bus? Não é comum enviar qualquer método -init* em um objeto já inicializado. Eu acho que você provavelmente está confuso com as convenções de gerenciamento de memória em toque de cacau. Aqui está uma coleção de artigos e outras referências no gerenciamento de memória de cacau (que é a mesma besta).

Você já tentou usar addannotações em vez de adicionar anotação? - (void) Addannotações: (NSARRAY *) anotações. Isso pode funcionar para você ... mas, olhando para a resposta acima e a inspeção adicional, você está tendo alguns problemas de gerenciamento de memória no seu ViewDidload (embora isso possa não ser a causa do seu problema, mas poderia ser). Primeiro de vocês, está alocando a matriz (paradas) e depois ovando -a com alguma matriz no objeto de barramento, isso causará um vazamento. Além disso, você está lançando a matriz que pode estar causando o acidente, pois está lançando a matriz que está realmente no objeto de ônibus sem ter aumentado uma contagem de referência. Não tenho certeza do que o InitWithStop está fazendo, mas você pode estar recebendo um vazamento aqui também se o InitwithStop mantiver o objeto.

Eu não chamaria isso de um problema de gerenciamento de memória - eu diria que você está usando referências de matriz incorretamente.

Depois de construir a matriz com nsmutableArray *stops = [[nsmutableArray aloc] init], a próxima etapa é usar [stops addObject:] para adicionar cada parada que você deseja armazenar.

Depois disso? Não está claro o que você está realmente tentando fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top