gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:58:50 27 4
gpt4 key购买 nike

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

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

我也测试了 2 个场景。

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

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

代码:

-(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 时不支持 nibs 吗?

-(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

最佳答案

通过将文件所有者的类更改为 CAnnotationView,然后将 nib 中的顶层 View 设为我添加为 subview 的导出,可以解决此问题。

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

关于iOS 6 addAnnotation EXC_BAD_ACCESS,但在 iOS 7 上没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531535/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com