Probleem het toevoegen van meerdere annotaties in kaart

stemmen
1

Ok, dus ik heb dit probleem. Wat ik wil doen is het handmatig toevoegen van meerdere annotaties aan een kaart. Toen ik slechts een annotatie toe te voegen, het werkt feilloos. De pen druppels, kunt u klikken op het aan zijn callout te zien, het leven is goed.

Het probleem komt wanneer ik wil meer toe te voegen dan één. Toen ik de tweede toe te voegen, plotseling de pin's zijn niet goed gekleurd (dwz afhankelijk van hun omvang moeten ze een bepaalde kleur te zijn, maar ze zijn nu allebei hetzelfde ...), en nog belangrijker wanneer u klikt op hen, om hun te zien bijschrift, de app crasht met exex_bad_access. Ik heb echt geen idee wat er mis is, misschien ben ik het toevoegen van te veel uitzicht op de kaart? Maar het is slechts 9 pinnen en de pennen zelf toe prima. Hier is mijn 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;
}

zelfs geprobeerd het verwijderen van de tweede functie, maar het deed niets.

Bedankt voor de hulp! PS Ik moet ook toevoegen, is er meestal een of twee pennen van de 9 die werkt als je de aantekening op ...

Als ik zelfs proberen om handmatig slechts twee aantekeningen met de hand in het programma (dat wil zeggen, verwijder de lus), het nog niet lukt en de kleur is nog steeds fout ...

De vraag is gesteld op 17/08/2009 om 18:49
bron van user
In andere talen...                            


4 antwoorden

stemmen
1

Het lijkt erop dat je geheugen beheer van de stopsvariabele is onjuist. U wijst een veranderlijk array, en vervang de matrix met de terugkeer waarde van -[Bus returnStops], dan los dat. Ook is niet duidelijk wat er aan de hand met bus2- heeft -[Bus initWithStop:]weer een ander voorbeeld van Bus? Het is niet gebruikelijk om een methode te sturen -init*op een reeds-geïnitialiseerd object. Ik denk dat u waarschijnlijk in de war door het geheugenbeheer conventies in Cocoa Touch. Hier is een verzameling van artikelen en andere verwijzingen op Cocoa memory management (dat is hetzelfde beest).

antwoordde op 17/08/2009 om 18:55
bron van user

stemmen
0

Dus het antwoord was dat ik hield het verzenden van bus1 de init object, dus werd het in de war.

"Hoi David,

Uw gegevens model ziet er schoongespoten voor mij. Je hebt maar één bus object dat u herhaaldelijk verzendt initWithStop: aan.

Ik hoop dat dit helpt.

Succes! "

Dank jullie voor jullie hulp! Je hielp me nogal wat!

antwoordde op 17/08/2009 om 20:02
bron van user

stemmen
0

Ik zou het niet noemen het een memory management probleem - ik zou gewoon zeggen dat je gebruik maakt van reeks verwijzingen onjuist.

Na de bouw van de array met NSMutableArray * stopt = [[NSMutableArray alloc] init], de volgende stap is om te gebruiken [stopt addObject:] toe te voegen iedere halte u wilt opslaan.

Daarna? Het is niet duidelijk wat je echt probeert te doen.

antwoordde op 17/08/2009 om 19:34
bron van user

stemmen
0

Heb je geprobeerd met behulp van AddAnnotations in plaats van toe te voegen annotatie? - (void) addAnnotations: (NSArray *) annotaties. Dit zou kunnen werken voor u ... maar te kijken naar het antwoord boven en verdere inspectie je met een aantal geheugenbeheer problemen in uw viewDidLoad (hoewel thi is misschien niet de oorzaak van het probleem te zijn, maar het zou kunnen zijn). In de eerste plaats dat u de toewijzing van de array (stopt) en vervolgens ovveriding met enkele array in de Bus object, zal dit een lekkage veroorzaken. Ook wordt daarna losgemaakt de matrix die de botsing zou kunnen veroorzaken omdat u loslaten van de array die eigenlijk in de bus object w ithout referentietelling met verhoogde aan. Ik weet niet zeker wat initWithStop aan het doen is, maar je zou kunnen krijgen een lek hier ook als initWithStop behoudt zich het object.

antwoordde op 17/08/2009 om 18:56
bron van user

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