我注意到,当我这样做:只有<NSXMLParserDelegate>,只有setDelegate方法或两者的用法有区别吗?
[myParser setDelegate:self];
它的工作原理:d(即使我没有在头文件中添加代码......你知道,
<delegateStuff, delegateOtherStuff>
在
接口声明)
什么时候你应该修改头文件来使你的委托工作? setDelegate方法足以使其工作吗?
干杯的任何帮助;)
戈捷
我注意到,当我这样做:只有<NSXMLParserDelegate>,只有setDelegate方法或两者的用法有区别吗?
[myParser setDelegate:self];
它的工作原理:d(即使我没有在头文件中添加代码......你知道,
<delegateStuff, delegateOtherStuff>
在
接口声明)
什么时候你应该修改头文件来使你的委托工作? setDelegate方法足以使其工作吗?
干杯的任何帮助;)
戈捷
简而言之,您的接口声明中的<NSXMLParserDelegate>
不是必需的,它在编译时用于错误检查。如果您想接收委托消息,则调用setDelegate:
方法需要使用。
您提到的<delegateStuff>
是协议声明。 Objective-C中的协议就像Java中的接口:它定义了类响应的消息(方法)列表。然而,与Java不同的是,Objective-C是动态类型的,意味着任何消息都可以发送到任何对象,并且只能确定它是否会在运行时响应。
这样做的结果是,如果像setDelegate:
这样的方法要求输入id
类型的参数,则可以给它任何对象。 NSXMLParser中的代码可以在发送之前检查它是否能够响应特定的消息。这样你可以实现你想要的任何委托方法。 (因为Java有更严格的类型检查,所以你必须实现接口中的所有方法,无论你是否需要它们。)
如果setDelegate:
代替id <NSXMLParserDelegate>
类型,它现在说它需要一个对象实现NSXMLParserDelegate协议。但是,这只在编译时检查,以帮助您发现错误。如果您使用类型转换,您可以发送任何对象,只要它响应所需的消息,程序就可以正常运行。 (再次,在Java中,可以使用类型转换来编译,但如果对象不是正确的类型,即使它具有相同的方法,类型转换本身也会抛出异常。)
顺便说一下,你是的子类 NSXMLParser? (我假设是这样,因为你通过self
到setDelegate:
这不是它的意图使用的方式! Cocoa框架通常更喜欢委托代替子类。你的委托类应该是一个独立的类扩展NSObject(或其他的东西如果你想)。
当它的需要,编译器会告诉你一个警告。
我注意到,当你添加到头文件时,Xcode能够自动完成你想要使用的任何委托方法。我每次都是这样做的。
编译器现在警告说,如果是根据iPhone SDK 4.0
A“代表”失踪总会只要实现了被称为在运行时的选择工作。声明一个匹配的委托协议不是必需的,但是如果委托输入的不仅仅是“id”(例如,id [SomeDelegateProtocol]委托),则可以得到一个编译器警告。然而,如果你声明一个类符合特定协议的规范,那么(a)该协议必须存在,并且(b)你的类将被检查协议选择器。现在包含在iPhone SDK 4中的NSXMLParserDelegate将导致较旧的应用程序发出警告;如果添加协议,然后尝试向后编译为3.x,则会出现编译错误,因为该协议在4之前不存在(至少您不可能在其中包含具有该协议的框架)。我刚刚遇到这个,因为我开始将当前的应用程序从3迁移到4.我讨厌我无法轻易消除的警告。
假设部署目标设置为3.X并且Base SDK设置为4.0,如果我们包含NSXMLParserDelegate,应用程序是否会在3.X下崩溃? – 2010-06-20 23:49:47