Problem dodając wiele adnotacji do mapy

głosy
1

Ok, więc mam ten problem. Co chcę zrobić to ręcznie dodać wiele adnotacji na mapie. Kiedy dodać tylko jedną adnotację, że działa bez zarzutu. Krople pin, można kliknąć na nim, aby zobaczyć jego objaśnienie, życie jest dobre.

Problem pojawia się, gdy chcę dodać więcej niż jeden. Kiedy dodać drugi, nagle kołek na nie są prawidłowo kolorowe (czyli w zależności od ich wielkości, powinny one być pewien kolor, ale są teraz zarówno to samo ...), a co ważniejsze, po kliknięciu na nich, aby ich objaśnienie, aplikacja wywala z exex_bad_access. I naprawdę nie mam pojęcia, co się dzieje, może Dodaję zbyt wiele poglądów na mapie? Ale to tylko 9 szpilki i kołki sami dodawać dobrze. Oto mój kod ...

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

nawet próbował usuwania drugą funkcję, ale nie zrobił nic.

Dzięki za pomoc! PS I należy również dodać, nie ma zwykle jeden lub dwa piny wyjścia z 9, które działa po kliknięciu adnotacji ...

I nawet jeśli próby ręcznego zaledwie dwóch adnotacji ręcznie w programie (czyli usunąć pętla), to nadal nie powiedzie, a kolor nadal jest zły ...

Utwórz 17/08/2009 o 18:49
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
1

Wydaje się, że zarządzanie pamięcią o stopszmiennej jest nieprawidłowy. Państwo przeznaczyć zmienny tablicę, a następnie zastąpić tę tablicę wartości zwracanej -[Bus returnStops], a następnie zwolnić tego. Także to nie jest jasne, co dzieje się z bus2- nie -[Bus initWithStop:]zwróci inną instancję Bus? To nie jest zwykły wysłać dowolną metodę -init*na już zainicjowany obiekt. Myślę, że prawdopodobnie są mylone przez konwencje zarządzania pamięcią w Cocoa Touch. Oto zbiór artykułów i innych odniesień dotyczących zarządzania pamięcią Cocoa (która jest taka sama bestia).

Odpowiedział 17/08/2009 o 18:55
źródło użytkownik

głosy
0

Więc odpowiedź była taka, że ​​przechowywane wysyłając bus1 obiekt startowy, więc to irytować.

"Cześć David,

Twój model danych wygląda hosed do mnie. Masz tylko jeden obiekt autobusów, które są wielokrotnie podając initWithStop: na.

Mam nadzieję że to pomoże.

Powodzenia! "

Dziękuję wam za pomoc! Wszyscy pomógł mi trochę!

Odpowiedział 17/08/2009 o 20:02
źródło użytkownik

głosy
0

Nie nazwałbym tego problemem zarządzania pamięcią - Chciałbym tylko powiedzieć, że są nieprawidłowo pomocą odwołań tablicy.

Po konstruowaniu tablicę NSMutableArray * zatrzymuje = [[NSMutableArray alloc] startowych], następnym krokiem jest użycie [zatrzymuje addObject:], aby dodać każdy przestać chcesz przechowywać.

Po tym? Nie jest jasne, co się naprawdę staramy się robić.

Odpowiedział 17/08/2009 o 19:34
źródło użytkownik

głosy
0

Czy próbowałeś za pomocą AddAnnotations zamiast dodać adnotację? - (void) addAnnotations: (NSArray *) adnotacji. To może pracować dla Ciebie ... ale patrząc na odpowiedzi powyżej i dalszej kontroli Państwo mają pewne problemy Managment pamięci w viewDidLoad (choć jes s nie może być przyczyną problemu, ale może to być). Po pierwsze jesteś alokowanie tablicę (przystanki), a następnie ovveriding go z jakiejś tablicy w obiekcie Bus, spowoduje to wyciek. Również są następnie zwalniając tę ​​tablicę, która może być przyczyną katastrofy, ponieważ jesteś zwolnieniu tablicę, która jest faktycznie w obiekcie Bus wag ez wzrosły licznika odwołań do niego. Nie jestem pewien, co initWithStop robi, ale może być coraz przeciek tutaj zbyt jeśli initWithStop zachowuje obiekt.

Odpowiedział 17/08/2009 o 18:56
źródło użytkownik

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