使用id <delegate>作为函数</delegate>的属性或参数

时间:2012-06-05 04:26:02

标签: iphone objective-c

所以我不确定这是如何运作的。我简要地看了一下同事的C#(我不是.NET开发人员),我看到很多传递给方法的东西都是符合接口的类对象。这也是Objective-c中的好事吗?

例如,我正在搞乱MapKit API并且我创建了自己的类,它符合MKAnnotation协议,所以我可以拥有自定义视图和一些额外的属性,用于在地图上删除的典型引脚。我计划使用我创建的这个类,

Address : NSObject
当我在地图上放置引脚时,

而不是MKPlacemark类。在我的其他视图控制器和模型类中,我该做:

@property (nonatomic, strong) id <MKAnnotation> object; //1 

@property (nonatomic, strong) Address *object; //2

我从示例1开始,但是当我实际需要Address对象的一些属性时,我发现自己不得不对对象进行类型转换,这似乎就是重点,或者我忽略了这一点?所以我想我的最终问题是,1或2更好,在什么情况下?感谢。

2 个答案:

答案 0 :(得分:0)

我会选择看起来像这样的选项3:

Address : NSObject <MKAnnotation>

然后,当您实现该类时,请实现符合MKAnnotation协议所需的方法。

通过这种方式,您可以充分利用这两个方面。

协议与C#或Java等语言中的接口非常相似。其中一个主要区别是需要某些方法的能力,并且其他方法是可选的。由于Objective-C是一种动态语言,因此您会看到许多调用,例如[foo responseToSelector:@selector(someSelector:)]。如果-someSelector:被标记为可选,则需要检查接收方是否“响应”该消息。但是,如果它被标记为必需,如果您没有实现该方法,则编译会抛出警告。有关详细信息,请查看Objective-C Language Reference

答案 1 :(得分:0)

您不能对ID类型使用强关键字,请改用:

@property (nonatomic, assign, readwrite) id<MyDelegate> delegate;