2009-08-17 3 views
1

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

Проблема возникает, когда я хочу добавить более одного. Когда я добавляю второй, вдруг булавки не окрашены правильно (т. Е. В зависимости от их величины они должны быть определенного цвета, но теперь они одинаковы ...), и что еще более важно, когда вы нажимаете на них, чтобы увидеть их выноска, приложение вылетает с 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; 
} 

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

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

Если я даже попытаюсь вручную вручную вручную записать две аннотации вручную (то есть удалить петлю) , он все еще не работает и цвет по-прежнему ошибочен ...

+0

Кроме того, я должен добавить, что, если добавить две аннотации к карте вручную, вещь происходит сбой таким же образом. автобус * BUS2 = [bus1 initWithStop: [останавливается objectAtIndex: 0]; MapAnnotation * eqAnn = [MapAnnotation annotationWithBus: BUS2]; [self.mapView addAnnotation: eqAnn]; Bus * BUS2 = [bUS1 initWithStop: [останавливается objectAtIndex: 1]; MapAnnotation * eqAnn = [Аннотации к базе данных аннуляцииWithBus: bus2]; [self.mapView addAnnotation: eqA пп]; Это все еще не удается. – kodai

ответ

0

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

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

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

Надеются, что это помогает..

Удачи вам! "

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

1

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

0

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

0

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

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

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

Смежные вопросы