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

голоса
1

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

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

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

Задан 17/08/2009 в 18:49
источник пользователем
На других языках...                            


4 ответов

голоса
1

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

Ответил 17/08/2009 в 18:55
источник пользователем

голоса
0

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

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

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

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

Удачи! "

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

Ответил 17/08/2009 в 20:02
источник пользователем

голоса
0

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

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

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

Ответил 17/08/2009 в 19:34
источник пользователем

голоса
0

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

Ответил 17/08/2009 в 18:56
источник пользователем

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