我有一个应用程序显示地图和自定义注释.当用户触摸注释时,我的应用程序崩溃.它只发生在iOS 7中. iOS 6和iOS 5都能正常工作.
以下是控制台中显示的崩溃报告:
ERROR: Trying to select an annotation which has not been added -[__NSSetM coordinate]: unrecognized selector sent to instance 0x18c9d580 *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[__NSSetM coordinate]: unrecognized selector sent to instance 0x18c9d580' *** First throw call stack: ( 0 CoreFoundation 0x020415e4 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x016918b6 objc_exception_throw + 44 2 CoreFoundation 0x020de903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275 3 CoreFoundation 0x0203190b ___forwarding___ + 1019 4 CoreFoundation 0x0206e46e __forwarding_prep_1___ + 14 5 MapKit 0x000de10c _Z21_insertionNodeForItemP11objc_objectP14MKQuadTrieNode + 50 6 MapKit 0x000de428 _Z9_containsP11objc_objectP14MKQuadTrieNode + 27 7 MapKit 0x000de8ed -[MKQuadTrie contains:] + 39 8 MapKit 0x000d4918 -[MKAnnotationManager selectAnnotation:animated:avoid:] + 116 9 MapKit 0x00090789 -[MKMapView handleTap:] + 541 10 UIKit 0x0056ae8c _UIGestureRecognizerSendActions + 230 11 UIKit 0x00569b00 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 383 12 UIKit 0x0056b56d -[UIGestureRecognizer _delayedUpdateGesture] + 60 13 UIKit 0x0056eacd ___UIGestureRecognizerUpdate_block_invoke + 57 14 UIKit 0x0056ea4e _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317 15 UIKit 0x00565148 _UIGestureRecognizerUpdate + 199 16 CoreFoundation 0x020094ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 17 CoreFoundation 0x0200941f __CFRunLoopDoObservers + 399 18 CoreFoundation 0x01fe7344 __CFRunLoopRun + 1076 19 CoreFoundation 0x01fe6ac3 CFRunLoopRunSpecific + 467 20 CoreFoundation 0x01fe68db CFRunLoopRunInMode + 123 21 GraphicsServices 0x01f6c9e2 GSEventRunModal + 192 22 GraphicsServices 0x01f6c809 GSEventRun + 104 23 UIKit 0x001f2d3b UIApplicationMain + 1225 24 CustomMKAnnotationView 0x0000285a main + 170 25 CustomMKAnnotationView 0x000027a5 start + 53 ) libc++abi.dylib: terminating with uncaught exception of type NSException
而且我以下列方式创建了代码:
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { if ([view.annotation isKindOfClass:[BasicMapAnnotation class]]) { if (_calloutAnnotation.coordinate.latitude == view.annotation.coordinate.latitude&& _calloutAnnotation.coordinate.longitude == view.annotation.coordinate.longitude) { return; } if (_calloutAnnotation) { [mapView removeAnnotation:_calloutAnnotation]; _calloutAnnotation = nil; } _calloutAnnotation = [[[CalloutMapAnnotation alloc] initWithLatitude:view.annotation.coordinate.latitude andLongitude:view.annotation.coordinate.longitude]autorelease]; [mapView addAnnotation:_calloutAnnotation]; [mapView setCenterCoordinate:_calloutAnnotation.coordinate animated:YES]; }else { if([delegate respondsToSelector:@selector(customMKMapViewDidSelectedWithInfo:)]) { [delegate customMKMapViewDidSelectedWithInfo:@"Annotation clicked"]; } } } -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { if (_calloutAnnotation&& ![view isKindOfClass:[CallOutAnnotationVifew class]]) { if (_calloutAnnotation.coordinate.latitude == view.annotation.coordinate.latitude&& _calloutAnnotation.coordinate.longitude == view.annotation.coordinate.longitude) { [mapView removeAnnotation:_calloutAnnotation]; _calloutAnnotation = nil; } } } -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if ([annotation isKindOfClass:[CalloutMapAnnotation class]]) { CallOutAnnotationVifew *annotationView = (CallOutAnnotationVifew *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CalloutView"]; if (!annotationView) { annotationView = [[[CallOutAnnotationVifew alloc] initWithAnnotation:annotation reuseIdentifier:@"CalloutView"] autorelease]; JingDianMapCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"JingDianMapCell" owner:self options:nil] objectAtIndex:0]; cell.titleLable.text = @"Testing"; [annotationView.contentView addSubview:cell]; } return annotationView; }else if ([annotation isKindOfClass:[BasicMapAnnotation class]]) { MKAnnotationView *annotationView =[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomAnnotation"]; if (!annotationView) { annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomAnnotation"] autorelease]; annotationView.canShowCallout = NO; annotationView.image = [UIImage imageNamed:@"pin.png"]; } return annotationView; } return nil; }
在didSelectAnnotationView和didDeselectAnnotationView中,我添加了新的注释视图,并删除了旧的注释视图.注释视图是自定义类.而_calloutAnnotation是CalloutMapAnnotation的一个对象,它是添加注释的NSObject类.
解决方法
_calloutAnnotation不包含注释视图.我认为你有某个代码像这样@prorerty(弱,非原子)MKAnnotation * calloutAnnotation;弱势强弱应该有所帮助.