【问题标题】:Objective C MKMapView EXC_BAD_ACCESS目标 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。

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

谢谢。

【问题讨论】:

    标签: objective-c mapkit


    【解决方案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 的理解,所以如果我有任何错误,请随时纠正我。

    【讨论】:

    • 刚吃完午饭回来;这是一个绝妙的答案,非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多