目标 C MKMapView EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】目标 C MKMapView EXC_BAD_ACCESS【英文标题】:Objective C MKMapView EXC_BAD_ACCESS 【发布时间】:2012-07-17 11:01:02 【问题描述】:

我是一名新手 ObjC 程序员(上周开始学习);尝试从 MKMapView 的中心获取纬度和经度时,我得到了一些意想不到的结果。

当地图更改区域时,我会调用以下方法:

- (void)mapView:(MKMapView*)mapView regionDidChangeAnimated:(BOOL)animated 
    NSLog(@"------> %@", mapView);
    latLabel.text = [[NSString alloc] initWithFormat:@"%@", [mapView centerCoordinate]];

在我没有得到(null)的日志中,我得到了一个 MKMapView 对象的打印输出;但在下一行我得到一个未处理的 EXC_BAD_ACCESS。

感谢任何帮助,如果需要,我很乐意提供更多信息。

谢谢。

【问题讨论】:

【参考方案1】:

CLLocationCoordinate2D 不是一个 Objective-C 对象,它是一个 C 结构。你不能直接把它转换成这样的NSString

试试:

CLLocationCoordinate2D center = [mapView centerCoordinate];
latLabel.text = [NSString stringWithFormat:@"(%f, %f)", center.latitude, center.longitude];

编辑:由于您是 Objective-C 的新手,您可能想了解一下这个问题是如何发生的,以及为什么错误消息如此不具描述性。

[NSString stringWithFormat:...] 采用格式字符串和任意数量的参数。然后它会解析格式字符串并根据需要填写参数。

格式字符串中的%@ 标记指定了一个Objective-C 对象;即NSObject * 或其子类。 NSObject 定义提供对象的NSString * 描述的description 方法。 stringWithFormat: 在为 %@ 令牌提供的参数上调用 description 以将其填充到格式字符串中。

结果是使用您的CLLocationCoordinate2D 结构调用objc_msgSend 以进行description 调用,因为NSString 假定您提供了正确类型的参数。然后发生崩溃,因为objc_msgSend 将结构视为NSObject * 指针并尝试访问错误位置的内存。因此EXC_BAD_ACCESS

免责声明:这是基于我几年后对 Objective-C 的理解,所以如果我有任何错误,请随时纠正我。

【讨论】:

刚吃完午饭回来;这是一个绝妙的答案,非常感谢! :)

以上是关于目标 C MKMapView EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

从 UIViewController 中删除我的自定义 MKMapView

如何在 MKMapView 上显示自定义注释?

在 MKMapView Objective c 中手动更改用户的当前位置

UIPageViewController 中的 UINavigationController 中的 iOS MKMapview

如何添加在图形页面定制标注视图

MKMapView中心坐标不准确