1

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

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

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

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

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

谢谢。

4

1 回答 1

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_msgSend您的CLLocationCoordinate2D结构来进行description调用,因为NSString假设您提供了正确类型的参数。然后发生崩溃,因为objc_msgSend将结构视为NSObject *指针并尝试访问错误位置的内存。因此EXC_BAD_ACCESS.

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

于 2012-07-17T11:08:16.500 回答