问题:程序收到信号:“EXC_BAD_ACCESS”。虽然构建和运行良好

时间:2011-01-03 15:06:31

标签: iphone objective-c debugging mapkit

我是XCODE的新手,使用mapkit和注释,如何在构建和运行良好之后, 应用程序在加载时崩溃。我运行了调试器并且;

停在断点1'mapView:viewForAnnotation: - 第951行'

在几次命中后继续

编程接收信号:“EXC_BAD_ACCESS”。

我已经阅读了无数的解决方案,与alloc或release或其他东西有关,但不知道我的代码中的问题在哪里。

编辑:问题已解决。

4 个答案:

答案 0 :(得分:3)

如果发生崩溃,则会有回溯。发布它。

答案 1 :(得分:2)

不是您问题的直接答案,但我强烈建议您使用switch语句替换长“else if”代码。使您的代码看起来更清晰,编译器可以进行优化。

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

编辑; 看完其他评论(来自Eiko)之后,我不得不同意在这种情况下你甚至想要删除这整段代码并用一些集合替换它。代码包含太多重复。

答案 2 :(得分:1)

严重过多的代码。

以下是解决这些错误的方法。

a)在XCode的“运行”菜单中启用“停止Objective-C异常”。这将使您非常接近错误发生的位置。只要看一下堆栈,你就能算出来。

b)如果这没有帮助,那么尝试NSZombie路线,虽然我从来没有需要使用它。 http://www.cocoadev.com/index.pl?DebuggingAutorelease。我主要是通过查看代码来计算。

希望这有帮助。

答案 3 :(得分:1)

如果不使用plist或集合,

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