代表设置意味着什么?

时间:2012-02-23 14:04:52

标签: ios delegates

在XML解析的示例代码中,我遇到了一条评论:

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

//Initialize the delegate.
XMLParser *parser = [[XMLParser alloc] initXMLParser];

//Set delegate
[xmlParser setDelegate:parser];

有人可以告诉我协议的委托方法和委托之间的区别吗?

3 个答案:

答案 0 :(得分:2)

协议就像一个接口。如果您来自JAVA或C#,您已经看到了这一点。它只是一个没有实现的方法列表。类可以(或不符合)符合特定协议。类必须实现标记为必需的方法。那些可选项无法实现。

相反,委托是一种在两个不同对象之间创建关系的模式。其中一个,比如A,由第二个辅助,比如说B.换句话说,B为A做了一些事情。

两者之间的关系是协议中列出了委托方法(针对特定类)。这里称为委托协议。

为什么代表团很重要?在应用程序生命周期的某个时刻,如果类向其委托发送消息(这不是nil)并且它已实现了特定方法(它可以响应该选择器),则消息由其委托接收。此时,控制由执行某些计算的委托捕获,并且可能返回一些结果。

希望它有所帮助。

答案 1 :(得分:1)

委托的想法就像你正在进行一些操作以及什么时候完成它,或者需要通知另一个对象进行操作或从中获取数据询问代表一样。例如: 在表视图中,它需要从数据源获取列表并告诉某人何时选择了一个对象,即设置数据源的位置以及委托tableview将调用方法的对象。在协议中定义它们相应地实现。 (比如当你需要该协议中的内容时,请与该代表交谈)

我希望这种非正式的解释可以帮助你

有关代表的更多(正确)信息,请检查:http://en.wikipedia.org/wiki/Delegation_pattern

答案 2 :(得分:1)

一般来说,它是“完成工作”的对象。

对于NSXMLParser,在创建解析器时,将对象设置为其委托,这意味着此对象需要实现NSXMLParsedDelegate方法。

例如:

- (void) parseData:(NSData*) xmlResponse;

- (void)parserDidStartDocument:(NSXMLParser *)parser;

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

- (void)parserDidEndDocument:(NSXMLParser *)parser;