Проблема с добавлением нескольких аннотаций на карту

Хорошо, значит, у меня есть эта проблема. Что я хочу сделать, так это вручную добавить несколько аннотаций на карту. Когда я добавляю только одну аннотацию, она работает безупречно. Булавка падает, вы можете нажать на нее, чтобы увидеть ее выноску, жизнь удалась.

Проблема возникает, когда я хочу добавить более одного. Когда я добавляю второй, вдруг булавки не окрашиваются правильно (т.е. в зависимости от их величины они должны быть определенного цвета, но теперь они оба одинаковы...), и, что более важно, когда вы нажимаете на них, чтобы увидеть их callout, приложение аварийно завершает работу с exex_bad_access. Я действительно понятия не имею, что не так, может быть, я добавляю слишком много видов на карту? Но там всего 9 пинов и сами пины нормально добавляются. Вот мой код…

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

даже пытался удалить вторую функцию, но это ничего не дало.

Спасибо за помощь! P.S Я также должен добавить, что обычно один или два контакта из 9 срабатывают, когда вы нажимаете на аннотацию…

Если я даже попытаюсь вручную вручную сделать две аннотации в программе (т.е. удалить цикл), это все равно не удастся, и цвет все равно будет неправильным...


person kodai    schedule 17.08.2009    source источник
comment
Кроме того, я должен добавить, что если я добавляю две аннотации на карту вручную, все вылетает ТАКИМ же образом. Bus *bus2 = [bus1 initWithStop:[останавливает objectAtIndex:0]; MapAnnotation *eqAnn = [Аннотация MapAnnotationWithBus:bus2]; [self.mapView addAnnotation:eqAnn]; Bus *bus2 = [bus1 initWithStop:[останавливает objectAtIndex:1]; MapAnnotation *eqAnn = [Аннотация MapAnnotationWithBus:bus2]; [self.mapView addAnnotation:eqAnn]; Это все еще не удается.   -  person kodai    schedule 17.08.2009


Ответы (4)


Может показаться, что ваше управление памятью переменной stops неверно. Вы выделяете изменяемый массив, затем заменяете этот массив возвращаемым значением -[Bus returnStops], а затем освобождаете его. Также неясно, что происходит с bus2 — возвращает ли -[Bus initWithStop:] другой экземпляр Bus? Не принято отправлять какой-либо метод -init* уже инициализированному объекту. Я думаю, что вас, вероятно, смущают соглашения об управлении памятью в Cocoa Touch. Вот коллекция статей и других ссылок об управлении памятью Cocoa. (тот же зверь).

person Community    schedule 17.08.2009

Вы пытались использовать AddAnnotations вместо добавления аннотации? - (void)addAnnotations:(NSArray *)аннотации. Это может сработать для вас ... но, глядя на ответ выше и дальнейшую проверку, у вас есть некоторые проблемы с управлением памятью в вашем viewDidLoad (хотя это может быть не причиной вашей проблемы, но может быть). Сначала вы выделяете массив (остановки), а затем проверяете его с помощью некоторого массива в объекте Bus, это вызовет утечку. Кроме того, вы затем освобождаете этот массив, который может вызвать сбой, поскольку вы освобождаете массив, который фактически находится в объекте Bus, не увеличивая счетчик ссылок на него. Я не уверен, что делает initWithStop, но вы можете получить утечку и здесь, если initWithStop сохраняет объект.

person Daniel    schedule 17.08.2009

Я бы не назвал это проблемой управления памятью — я бы просто сказал, что вы неправильно используете ссылки на массивы.

После построения массива с помощью NSMutableArray *stops = [[NSMutableArray alloc] init], следующим шагом будет использование [stops addObject:] для добавления каждой остановки, которую вы хотите сохранить.

После этого? Непонятно, что вы на самом деле пытаетесь сделать.

person Amagrammer    schedule 17.08.2009

Итак, ответ был в том, что я продолжал отправлять bus1 объект инициализации, поэтому он запутался.

"Привет Дэвид,

Ваша модель данных кажется мне неполной. У вас есть только один объект шины, которому вы постоянно отправляете initWithStop:.

Надеюсь это поможет.

Удачи! "

Спасибо, ребята, за вашу помощь! Вы все мне очень помогли!

person kodai    schedule 17.08.2009