iOS 6 addAnnotation EXC_BAD_ACCESS,但在iOS 7上没问题

时间:2014-05-08 02:07:37

标签: ios mkmapview exc-bad-access

我希望有人可以帮助我解决iOS 6上的这个奇怪的崩溃。

我正在构建适用于iOS 6的应用 - iOS 7,我使用MKMapView并添加了一个MKPointAnnotation。我还使用自定义MKAnnotationView来显示我的图钉和标注。在iOS 7上,一切都很美妙。但是,iOS 6我在EXC_BAD_ACCESS上获得MKMapView:addAnnotation。一切都在viewDidLoad完成。

我也测试过2个场景。

  1. 如果我在添加注释之前设置MKMapView委托,则会在iOS 6上崩溃。

  2. 如果我在添加注释后设置MKMapView委托,它在iOS 6上不会崩溃,但是viewForAnnotation没有被调用,我最终得到的是默认引脚而不是我的自定义引脚和标注。

  3. 代码:

    -(void)viewDidLoad
    {
        [super viewDidLoad];
    
        //set delegate
        self.mapView.delegate = self;
    
        //lat, long
        CGFloat latitude = 40.689249f;
        CGFloat longitude = -74.0445f;
    
        //coord, span, region
        CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(latitude, longitude);
        MKCoordinateSpan span = MKCoordinateSpanMake(0.05f, 0.05f);
        MKCoordinateRegion region = MKCoordinateRegionMake(coord, span);
    
        //annotation
        MKPointAnnotation annotation = [[MKPointAnnotation alloc] init];
        [annotation setTitle:@"title here"];
        [annotation setCoordinate:coord];
    
        [self.mapView setRegion:region];
        [self.mapView addAnnotation:annotation];//EXC_BAD_ACCESS here (iOS 7 no crash)
    }
    
    -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
    
        CAnnotationView *annotationView = (CAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:MKAnnotationViewReuseIdentifier];
    
        if (!annotationView)
            annotationView = [[CAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MKAnnotationViewReuseIdentifier];
    
        return annotationView;
    }
    

    好吧我发现在iOS 6中为我的CAnnotationView加载自定义nib会导致崩溃。如果我注释掉加载捆绑,那么不会再崩溃。

    在iOS 6中继承MKAnnotationView时,不支持nib吗?

    -(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
        if (self){
          NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"CAnnotationView" owner:self options:nil];
          self = [bundle firstObject];
        }
    
        return self;
    }
    

    这是我创建的一个小测试,可以复制崩溃。在iOS 6上运行会导致崩溃,iOS 7应该会看到放置在MKMapView上的自定义注释。 http://www.levieggert.com/MKMapView/MKMapViewCrashTest.zip

1 个答案:

答案 0 :(得分:1)

确定将文件所有者的类更改为CAnnotationView,然后将笔尖中的顶级视图作为子视图添加到插座中。

-(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    if (self){
      [[NSBundle mainBundle] loadNibNamed:@"CAnnotationView" owner:self options:nil]; 
      [self addSubview:self.view];
    }
}