Objective c @optional protocol方法的真实示例

Objective c @optional protocol方法的真实示例,objective-c,protocols,optional,Objective C,Protocols,Optional,我目前正在学习Objective-C,并且在协议中遇到了可选方法。我的背景是C#,可以将协议视为类似于C#接口的东西 当一个C#接口代表一个契约时,通过宣传一个接口,你是在说你将实现定义的方法 考虑到这一点,我不明白为什么需要定义可选方法。这不是对Objective-C的诋毁或贬低,我喜欢Objective-C。我只是想了解这些可选方法的好处,以便更好地理解该语言 如果有人能提供一些可选方法有用的真实场景(带有示例代码),我将不胜感激。我将给您举个例子。我有许多与Flickr API对话的Obj

我目前正在学习Objective-C,并且在协议中遇到了可选方法。我的背景是C#,可以将协议视为类似于C#接口的东西

当一个C#接口代表一个契约时,通过宣传一个接口,你是在说你将实现定义的方法

考虑到这一点,我不明白为什么需要定义可选方法。这不是对Objective-C的诋毁或贬低,我喜欢Objective-C。我只是想了解这些可选方法的好处,以便更好地理解该语言


如果有人能提供一些可选方法有用的真实场景(带有示例代码),我将不胜感激。

我将给您举个例子。我有许多与Flickr API对话的ObjC类。一个名为
FKAccount
的帐户可以做很多与Flickr用户帐户相关的事情,包括下载用户的照片、获取他们的联系人列表等等

FKAccount
类定义委托协议
FKAccountDelegate
。此协议指定了许多回调方法,
FKAccount
将根据对Flickr的各种网络操作的成功或失败对其委托调用这些方法。并非所有使用
FKAccount
的应用程序都会对
FKAccount
可以执行的每个Flickr操作感兴趣

如果要求声称实现
FKAccountDelegate
协议的每个类都实现每个方法,那么最终将得到许多存根方法(FWIW,在
FKAccountDelegate
中定义了41个方法)。当这些方法在协议中声明为
@optional
时,代理只需要实现它感兴趣接收的回调

FKAccount
类通过以下方式检查其委托是否响应协议中的
@可选
方法:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
    [self.delegate accountDidDownloadContacts: self];
}

我想我现在明白了。C#接口只是Objective-C协议的一个方面。您可以将协议用作契约,但这些可选方法构成了对象也可以选择响应的可选委托列表。真有意思。我完全同意@Tom。在Objective-C2.0之前,委托方法通常在NSObject的类别中声明,以避免任何想要成为委托的类必须实现所有方法。协议中的可选方法是一个更干净的解决方案,它不会将大量的方法附加到NSObject上,并有助于避免方法冲突。如果只有Java有可选的接口方法,就不需要继承MouseAdapter之类的东西。使用这样的类通常是我诅咒单继承的几次…:-)