1

我注意到当我这样做时:

[myParser setDelegate:self];

它有效:D(即使我没有在头文件中添加代码......你知道,

<delegateStuff, delegateOtherStuff> 

在接口声明中)

您什么时候应该修改头文件以使您的委托工作?setDelegate 方法是否足以使其工作?

为任何帮助干杯;)

高捷

4

4 回答 4

1

如果在 iPhone SDK 4.0 下缺少,编译器现在会发出警告

于 2010-05-31T04:08:31.567 回答
1

需要时,编译器会通过警告通知您。

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

于 2010-02-20T16:32:52.280 回答
1

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

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

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

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

顺便说一句,你是继承NSXMLParser 吗?(我假设是这样,因为您要传递selfsetDelegate:.这不是它的使用方式! Cocoa 框架通常更喜欢委托而不是子类。您的委托类应该是扩展 NSObject 的单独类(或者如果您想要的其他东西) .

于 2010-02-20T17:14:56.157 回答
0

只要“委托”实现了在运行时调用的选择器,它就会一直工作。不需要声明匹配的委托协议,但如果委托的类型不仅仅是“id”(例如,id [SomeDelegateProtocol] 委托),您可能会收到编译器警告。

但是......如果您声明一个类符合特定协议的规范,那么(a)该协议必须存在并且(b)您的类将被检查协议选择器。现在包含在 iPhone SDK 4 中的 NSXMLParserDelegate 会导致旧应用程序抛出警告;如果您添加协议,然后尝试向后编译到 3.x,您将收到编译错误,因为该协议在 4 之前不存在(至少您不太可能在其中包含带有该协议的框架)。我刚开始将当前应用程序从 3 迁移到 4 时遇到了这个问题。我讨厌我无法轻易消除的警告。

于 2010-06-18T06:26:54.483 回答