我为ObjC类创建了自己的委托。该类本身处理核心数据操作。委托方法用于通知其他类关于发生在数据存储上的变化。处理数据存储的类称为Datastore,它的委托称为DatastoreDelegate。我的UIViewController(ContactsViewController)实现了委托。作为跟随委托方法似乎是@required,它被声明为@optional
我DatastoreDelegate声明:
@class Datastore;
@protocol DatastoreDelegate <NSObject>;
@optional
- (void)didAddMessage:(Message *)message;
- (void)didUpdateContact:(Contact *)contact;
- (void)didAddContact:(Contact *)contact;
- (void)didUpdateContact:(Contact *)contact;
- (void)didDeleteContacts;
@end
奇怪的是,我的代码都能正常运作这些方法除了[didAddMessage:]方法。每当我尝试从Datastore类中调用此委托时,我都会从ContactsViewController中获取一个错误。该错误告诉我在ContactsViewController实例(发送给实例的无法识别的选择器)中缺少[didAddMessage:]选择器。如果选择器是可选的,该如何丢失?
我应该注意到我的Datastore类是一个Singleton。我不确定这是否与我遇到的这个问题有关。
感谢时,[respondsToSelector:]消息固定我的问题。当消息本身被声明为@optional时,需要这样的消息很奇怪。 – 2010-01-30 19:47:52
想一想:如果该方法是可选的,那么委托类可能没有实现它。如果您发送委托人未回复的邮件,则会发生崩溃(默认情况下)。 – mipadi 2010-01-30 19:52:53
@optional仅仅意味着一个说它满足协议的类并不需要实现该方法。令你感到困惑的事情 - 调用者检查[respondsToSelector:] - 是所有委托消息的工作方式。 – 2010-01-30 19:53:27