目标 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 Objective c 中手动更改用户的当前位置
UIPageViewController 中的 UINavigationController 中的 iOS MKMapview