我是一名新手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。
任何帮助表示赞赏,如果有要求,我很乐意提供更多信息。
感谢。
答案 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_msgSend
与CLLocationCoordinate2D
结构调用description
来调用NSString
,因为objc_msgSend
假设您提供了正确的类型参数。然后发生崩溃是因为NSObject *
将结构视为EXC_BAD_ACCESS
指针,并尝试访问位置不正确的内存。因此{{1}}。
免责声明:这是基于我在几年后对Objective-C的理解,所以如果我对任何事情都不对,请随时纠正我。