MKMapView – 删除注释导致应用程序崩溃

从我的地图视图中删除注释以下列方式:

if ([[self.mapView annotations] count] > 0) { [self.mapView removeAnnotations:[self.mapView annotations]]; } 

导致我的应用程序崩溃,出现以下exception:

 *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <MKAnnotationContainerView 0xe87b420> for the key path "title" from <PFAnnotation 0x10851230> because it is not registered as an observer.' 

注释按以下方式添加:

  CLLocationCoordinate2D pinPosition; for (int index = 0; index < [array count]; index++) { Station *aStation = [array objectAtIndex:index]; PFAnnotation *stationPin = [[PFAnnotation alloc] init]; //StationPinView pinPosition = CLLocationCoordinate2DMake([[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]); stationPin.stationName = [aStation valueForKey:@"stationName"]; stationPin.stationPosition = pinPosition; stationPin.stationLength = [aStation valueForKey:@"platformLength"]; [self.mapView addAnnotation:stationPin]; [stationPin release]; } 

我的PFAnnotation.h是:

 @interface PFAnnotation : NSObject <MKAnnotation> { NSString *stationName; CLLocationCoordinate2D stationPosition; NSNumber *stationLength; } @property (nonatomic, retain) NSString *stationName; @property CLLocationCoordinate2D stationPosition; @property (nonatomic, retain) NSNumber *stationLength; @end 

我的PFAnnotation.m是:

 @implementation PFAnnotation @synthesize stationName; @synthesize stationPosition; @synthesize stationLength; - (CLLocationCoordinate2D)coordinate; { return stationPosition; } - (NSString *)title { return stationName; } - (NSString *)subtitle { if (stationLength == nil) return nil; else return [NSString stringWithFormat:@"Platform Length: %@ft",stationLength]; } - (void)dealloc { [stationName release]; [stationLength release]; [super dealloc]; } 

我读过其他一些线程,从后台线程设置注释属性是导致上述错误的原因。 但就我而言,并非如此,因为每一件事情都是在主线上进行的。 请指教。

好的..终于解决了! 我认为这是由于在添加注释期间提供的animation。 因为有多个注释是与animation背对背添加的,并且注释在animation开始之前被删除了,所以可能会有对已发布的注释的引用(这是我的猜测)。 此外,在每个regionDidChangeAnimated调用上执行删除+添加过程,这可能在删除和添加过程之间做出了重叠。 无论如何,我是如何解决这个问题的,我提供了一个计时器,在每个regionDidchangeAnimated后1秒钟后才会触发,以确保用户完成拖动。 因此避免了不必要的注释的添加+删除,我可以避免崩溃。 感谢所有人在这里花时间来支持我,特别是Guntis Treulands。

在你的PFAnnotation类中,你是否同时声明了标题和字幕属性?

http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKAnnotation_Protocol/Reference/Reference.html

如果你的PFAnnotation确实有不正确的setter gettersstring值:

从这里: http : //cocoadevcentral.com/d/learn_objectivec/

二传手:

 - (void) setCaption: (NSString*)input { [caption autorelease]; caption = [input retain]; } 

消气:

 - (NSString*) caption { return caption; } 

发布:

 - (void) dealloc { [caption release]; [super dealloc]; } 

另外 – 以这种方式提供坐标更容易:(也适用于ios 3.1.3)

 stationPin.stationPosition = (CLLocationCoordinate2D) {[[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]} 

比(仅来自ios 4)

 stationPin.stationPosition = CLLocationCoordinate2DMake([[aStation valueForKey:@"latitude"] doubleValue], [[aStation valueForKey:@"longitude"] doubleValue]); 

请检查代码中的任何位置是否正在清除“观察者”属性“标题”。