2010-02-20 82 views

回答

1

简而言之,您的接口声明中的<NSXMLParserDelegate>不是必需的,它在编译时用于错误检查。如果您想接收委托消息,则调用setDelegate:方法需要使用

您提到的<delegateStuff>是协议声明。 Objective-C中的协议就像Java中的接口:它定义了类响应的消息(方法)列表。然而,与Java不同的是,Objective-C是动态类型的,意味着任何消息都可以发送到任何对象,并且只能确定它是否会在运行时响应。

这样做的结果是,如果像setDelegate:这样的方法要求输入id类型的参数,则可以给它任何对象。 NSXMLParser中的代码可以在发送之前检查它是否能够响应特定的消息。这样你可以实现你想要的任何委托方法。 (因为Java有更严格的类型检查,所以你必须实现接口中的所有方法,无论你是否需要它们。)

如果setDelegate:代替id <NSXMLParserDelegate>类型,它现在说它需要一个对象实现NSXMLParserDelegate协议。但是,这只在编译时检查,以帮助您发现错误。如果您使用类型转换,您可以发送任何对象,只要它响应所需的消息,程序就可以正常运行。 (再次,在Java中,可以使用类型转换来编译,但如果对象不是正确的类型,即使它具有相同的方法,类型转换本身也会抛出异常。)

顺便说一下,你是的子类 NSXMLParser? (我假设是这样,因为你通过selfsetDelegate:这不是它的意图使用的方式! Cocoa框架通常更喜欢委托代替子类。你的委托类应该是一个独立的类扩展NSObject(或其他的东西如果你想)。

1

当它的需要,编译器会告诉你一个警告。

我注意到,当你添加到头文件时,Xcode能够自动完成你想要使用的任何委托方法。我每次都是这样做的。

1

编译器现在警告说,如果是根据iPhone SDK 4.0

0

A“代表”失踪总会只要实现了被称为在运行时的选择工作。声明一个匹配的委托协议不是必需的,但是如果委托输入的不仅仅是“id”(例如,id [SomeDelegateProtocol]委托),则可以得到一个编译器警告。然而,如果你声明一个类符合特定协议的规范,那么(a)该协议必须存在,并且(b)你的类将被检查协议选择器。现在包含在iPhone SDK 4中的NSXMLParserDelegate将导致较旧的应用程序发出警告;如果添加协议,然后尝试向后编译为3.x,则会出现编译错误,因为该协议在4之前不存在(至少您不可能在其中包含具有该协议的框架)。我刚刚遇到这个,因为我开始将当前的应用程序从3迁移到4.我讨厌我无法轻易消除的警告。

+0

假设部署目标设置为3.X并且Base SDK设置为4.0,如果我们包含NSXMLParserDelegate,应用程序是否会在3.X下崩溃? – 2010-06-20 23:49:47