Iphone拖放MapKit生成“无法识别的选择器发送到实例”异常

时间:2010-07-20 17:20:18

标签: iphone objective-c exception mapkit

最近下载的“MapKitDragAndDrop 3”软件包(http://github.com/digdog/MapKitDragAndDrop)将在我的应用中使用。演示项目运行顺利。

DDAnnotation.h + m和DDAnnotationView.h + m文件都按原样导入。调用该类的方法也被复制/粘贴。

DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease];
annotation.title = @"Drag to Move Pin";
annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude];

[self.mapView addAnnotation:annotation];

第一次运行导致“无法识别的选择器发送到实例”异常。调试器建议我在DDAnnotation类中实现setCoordinate方法;但是演示文件既没有@synthesize也没有方法实现。

DDAnnotation.m:

#import "DDAnnotation.h"
@implementation DDAnnotation

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary {

if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary])) {
    // NOTE: self.coordinate is now different from super.coordinate, since we re-declare this property in header, 
    // self.coordinate and super.coordinate don't share same ivar anymore.
    self.coordinate = coordinate; // CHECKPOINT
}
return self;
}

@end 

在跟踪DDAnnotation.m时,它在调试器中的CHECKPOINT上落入DDAnnotation.h中。在我的应用程序中,它没有。

我真的希望这个错误是愚蠢的,但我只是不知道在哪里看。感谢。

2 个答案:

答案 0 :(得分:1)

DDAnnotation.h文件中有关于此问题的评论。

//注意:因为@synthesize默认是由LLVM 1.5编译器完成的(带有 // flag -Xclang和-fobjc-nonfragile-abi2),我们不需要创建方法 // -setCoordinate:和它的ivar了。查看WWDC 2010视频,会话 // 144 - “高级Objective-C和垃圾收集技术”,了解更多信息 //详情。

答案 1 :(得分:0)

就像皮特说的那样,你需要更改项目文件中的一些设置:

因为项目正在使用LLVM中引入的合成属性,而GCC编译器不支持它。