我是Objective-C的新手,也是Apple平台上的开发人员,但希望我能以一种可以理解的方式构建这个问题,无论如何:)
我想解析我的iPhone应用程序的XML提要,我决定不将所有委托方法从NSXMLParser的实例推送到我的视图控制器中,我将其包装在FeedParser类中.在阅读了一些文档和示例代码之后,这就是我想出的:
@protocol FeedParserDelegate- (void)parserDidLoadEpisodes:(NSArray *)episodes; @end @interface FeedParser : NSObject { id delegate; } @property (nonatomic, assign) id delegate; - (id)initWithURL:(NSURL *)url delegate:(id )theDelegate; @end
简单.我的FeedParser对象的代表只需要实现parserDidLoadEpisodes
.
但是,当我开始实际FeedParser
使用我的类时NSXMLParser
,我意识到我没有必须指定FeedParser
实现协议NSXMLParser
- 我可以实现我想要做的事情的委托方法.我想我已经注意到了跟随委托模式的其他类,但不是全部.
那么为什么我也不愿意为我的FeedParser
课程指定一个正式的协议呢?它会削减一些可能不必要的代码.我想问题是:为什么我要创建一个正式的协议而不只是做一些事情,只需检查是否在委托上实现该方法 respondsToSelector
?是否只有这样,如果没有实现所需的委托方法,编译器将发出很好的警告?
声明的协议@protocol
称为"正式协议".另一种方法是在NSObject上声明一个类别(一组附加方法),如下所示:
@interface NSObject (FeedParserDelegate) - (void)parserDidLoadEpisodes:(NSArray *)episodes; @end
然后,只需为要作为feed解析器委托的任何对象定义该方法,否则保留未定义的方法.这被称为"非正式协议".
为什么有两种方式?嗯,这是一个提示:非正式协议首先出现.它归结为他们添加了正式的协议,因为非正式的协议没有削减它.非正式协议使得很容易忘记一个重要的方法,或者尝试将对象用作代理,而不是设计用于它的东西.
基本上,对于在
这里和那里添加的成本,您可以让编译器为您进行调试.编译器将为最常见的委托错误生成警告,如果您犯下其中一个错误,可以节省您的时间.为什么不利用它的帮助?