Objective C MKMapView EXC_BAD_ACCESS

时间:2012-07-17 11:01:02

标签: objective-c mapkit

我是一名新手ObjC程序员(上周开始学习);我试图从MKMapView的中心得到lat和long有一些意想不到的结果。

我有以下方法在地图更改区域时调用:

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

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

任何帮助表示赞赏,如果有要求,我很乐意提供更多信息。

感谢。

1 个答案:

答案 0 :(得分:2)

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定义了description方法,该方法提供了对象的NSString *描述。 stringWithFormat:在为description令牌提供的参数上调用%@,以便在格式字符串中填充它。

这样做的结果是objc_msgSendCLLocationCoordinate2D结构调用description来调用NSString,因为objc_msgSend假设您提供了正确的类型参数。然后发生崩溃是因为NSObject *将结构视为EXC_BAD_ACCESS指针,并尝试访问位置不正确的内存。因此{{1}}。

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