ПРОБЛЕМА: Программа получила сигнал: «EXC_BAD_ACCESS».Строит и работает хорошо, хотя - PullRequest
0 голосов
/ 03 января 2011

Я НОВЫЙ ДЛЯ XCODE, работаю с mapkit и аннотациями, как бы после сборки и не работал, приложение вылетает при загрузке. Я запустил отладчик и

Остановлено в точке останова 1 'mapView: viewForAnnotation: - Строка 951'

продолжается после нескольких ударов,

Программа получила сигнал: "EXC_BAD_ACCESS".

Я прочитал множество решений, связанных с alloc или release или чем-то, но не знаю, где проблема в моем коде.

РЕДАКТИРОВАТЬ: ПРОБЛЕМА РЕШЕНА.

Ответы [ 4 ]

3 голосов
/ 03 января 2011

Если происходит сбой, есть обратный след. Опубликуйте это.

2 голосов
/ 03 января 2011

Не прямой ответ на ваш вопрос, но я настоятельно рекомендую вам использовать оператор switch, чтобы заменить длинный код «else if». Делает ваш код намного чище, а ваш компилятор может оптимизировать его.

http://en.wikipedia.org/wiki/Switch_statement

Редактировать; Посмотрев на другие комментарии (от Eiko), я должен согласиться с тем, что в этом случае вы даже захотите удалить весь этот кусок кода и заменить его некоторым сборником. Код содержит слишком много дубликатов.

1 голос
/ 03 января 2011

mapView:viewForAnnotation может быть значительно короче, без использования списков или списков.Идентификатор повторного использования полезен для удаления аннотаций определенного типа или аннотаций, которые могут иметь дорогостоящие, но идентичные настройкиВы инициализируете каждую из ваших аннотаций одинаково, поэтому они могут без проблем использовать один и тот же идентификатор повторного использования.Таким образом, можно написать функцию:

- (MainViewAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{   
    if(annotation == mapView.userLocation) return nil;

    NSString* identifier = @"City";
    MainViewAnnotationView *newAnnotationView = (MainViewAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if(nil == newAnnotationView)
    {
        newAnnotationView = [[[MainViewAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease];
    }

    [newAnnotationView setEnabled:YES];
    [newAnnotationView setCanShowCallout:YES];

    return newAnnotationView;
}
1 голос
/ 03 января 2011

Серьезно слишком много кода для прохождения.

Вот как вы можете вычислить эти ошибки.

a) Включите «Остановить исключения Objective-C» в меню «Выполнить» XCode.Это приблизит вас к месту возникновения ошибки.Просто посмотрите на стек, и вы сможете понять.

б) Если это не поможет, то попробуйте маршрут NSZombie, хотя у меня никогда не было необходимости его использовать.http://www.cocoadev.com/index.pl?DebuggingAutorelease.Я в основном понимаю, просто просматривая код.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...