警告:iPhone 自定义地图标注中的问题

7
我在iPhone的地图视图中使用自定义地图注释类。每当我从导航栏堆栈中弹出我的地图视图时,通常会在控制台中看到一些警告。
地图注释在键值观察者仍然注册它时被释放。观察信息泄漏了,甚至可能误将其附加到其他对象上。在NSKVODeallocateBreak上设置断点以在调试器中停止。以下是当前的观察信息:
我没有在我的代码中使用KVO,因此无法理解为什么会收到这些警告。
4个回答

30

纬度和经度有不同的范围:

  • 纬度范围为(-90, 90)
  • 经度范围为(-180, 180)

如果传递的值超出这些范围,将导致自定义类被释放,从而导致您收到错误。确保同时传递正确的纬度和经度值。

如果Apple能提供一个边界错误而不是早期发布错误,那将非常好。这将节省我大约5个小时的时间。


问题在iOS7中仍然存在。由于我正在使用ARC,无法想象为什么我的地图注释会过早释放,所以我有点无助。很高兴我找到了你的答案!+1 - Reinhard Männer

7
我和你一样遇到了同样的错误:
An instance 0xa975400 of class xxxxxx was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0xa980eb0> (
<NSKeyValueObservance 0xa980e70: Observer: 0xa94f8a0, Key path: coordinate, Options: <New: NO, Old: NO, Prior: YES> Context: 0x0, Property: 0xa980ef0>

如此指出,这是因为我正在向MKMapView添加一个带有无效坐标的MKAnnotation。

我的解决方案是创建一个函数来检查坐标是否有效。

Place+MKAnnotation.m

我创建了一个我的地点类的分类,并且

#import "Place.h"
#import <MapKit/MapKit.h>

@interface Place (MKAnnotation) <MKAnnotation>
- (BOOL)coordinateIsValid;
...
@end

Place+MKAnnotation.m

@implementation Place (MKAnnotation)

- (BOOL)coordinateIsValid
{
    return CLLocationCoordinate2DIsValid(CLLocationCoordinate2DMake([self.latitude doubleValue],[self.longitude doubleValue]));

}
...
@end

只有在坐标有效时,我才会在我的ViewController中添加注释。

if([p coordinateIsValid]) {
    [self.mapView addAnnotation:p];
} 

1

问题已解决。我在注释中使用了错误的纬度和经度对,现在我已更正,并且一切似乎都完美无缺,警告也已消失。


你能提供一些更详细的解决方案吗? - James Mertz
@KronoS 我使用了一对不现实的错误纬度和经度,我已经使用了正确的值,再也没有看到那个警告了。 - sandy

0
你在将注释添加到MapView之前是否自动释放了它? 如果是的话,请尝试只分配它,将其添加到MapView,然后释放它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接