当前位置:  开发笔记 > Android > 正文

如果我希望我的班级有代表,我是否必须指定协议?

如何解决《如果我希望我的班级有代表,我是否必须指定协议?》经验,为你挑选了1个好方法。

我是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?是否只有这样,如果没有实现所需的委托方法,编译器将发出很好的警告?



1> Brent Royal-..:

声明的协议@protocol称为"正式协议".另一种方法是在NSObject上声明一个类别(一组附加方法),如下所示:

@interface NSObject (FeedParserDelegate)

- (void)parserDidLoadEpisodes:(NSArray *)episodes;

@end

然后,只需为要作为feed解析器委托的任何对象定义该方法,否则保留未定义的方法.这被称为"非正式协议".

为什么有两种方式?嗯,这是一个提示:非正式协议首先出现.它归结为他们添加了正式的协议,因为非正式的协议没有削减它.非正式协议使得很容易忘记一个重要的方法,或者尝试将对象用作代理,而不是设计用于它的东西.

基本上,对于在这里和那里添加的成本,您可以让编译器为您进行调试.编译器将为最常见的委托错误生成警告,如果您犯下其中一个错误,可以节省您的时间.为什么不利用它的帮助?

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有