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类中,你是否同时声明了标题和字幕属性?
如果你的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]);
请检查代码中的任何位置是否正在清除“观察者”属性“标题”。