【问题标题】:iOS 6 addAnnotation EXC_BAD_ACCESS, but okay on iOS 7iOS 6 addAnnotation EXC_BAD_ACCESS,但在 iOS 7 上还可以
【发布时间】:2014-05-08 02:07:36
【问题描述】:

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

我正在为 iOS 6 - iOS 7 构建一个应用程序,我正在使用一个 MKMapView 并添加了一个 MKPointAnnotation。我还使用自定义MKAnnotationView 来显示我的图钉和标注。在 iOS 7 上,一切运行良好。然而,iOS 6 我在MKMapView:addAnnotation 上得到了一个EXC_BAD_ACCESS。一切都在viewDidLoad 上完成。

我也测试了 2 个场景。

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

  2. 1234563

代码:

-(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 加载自定义笔尖会导致崩溃。如果我注释掉加载包,那么就不会再崩溃了。

那么在 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

【问题讨论】:

  • 显示分配注解的代码。此外,请显示您的 viewForAnnotation 代码。

标签: ios mkmapview exc-bad-access


【解决方案1】:

通过将文件所有者的类更改为 CAnnotationView 然后将 nib 中的顶级视图作为我添加为子视图的插座来修复。

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

【讨论】:

  • 您有没有找到其他解决方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多