2

我用调用类作为委托创建了一个 NSURLConnection。在意识到我从未将对象声明为遵守协议之前,我将它构建到我的测试设备上,但它运行了(我会说正常,但我认为我完全把我的应用程序搞砸了多个线程)。

那么是否不需要将对象声明为实现委托?

我也没有包含所有必需的委托方法,它仍然称为委托方法。

这个项目还有其他人,而且它相当大,所以也许委托协议被声明在某个模糊的地方,但我在标题和实现声明中搜索它时没有看到它。

4

3 回答 3

4

该方法的delegate参数NSURLConnection initWithRequest:delegate:使用类型定义id<NSURLConnectionDelegate>

如果您传递一个未声明它符合 的对象NSURLConnectionDelegate,您应该得到一个编译器警告,表明您传递了错误类型的对象。仔细检查您是否收到任何警告。如果不是,那么您的类在某个地方正确声明它符合协议。

在运行时,唯一的要求是委托对象实际上至少实现了委托所需的方法。但在这种情况下,协议中没有必需的方法。它们都是可选的。

您说:“我也没有包含所有必需的委托方法,它仍然称为委托方法。” 这没有意义。如果您不实施它们,如何调用它们?另外,协议中没有必需的方法。

于 2013-05-23T22:39:44.663 回答
1

我认为这取决于如何NSURLConnection实施。首先,如果setDelegate:方法/属性设置为接受 type 的对象id<NSURLConnectionDelegate>,那么编译器应该警告你。如果NSURLConnection源代码在调用任何协议方法之前使用(例如)检查委托+conformsToProtocol:,则不应回调您的对象。

编辑:rmaddy 补充说协议中的所有方法都是可选的。既然如此,那么NSURLConnection很可能使用 (instance)-respondsToSelector:而不是 (class)进行检查+conformsToProtocol:。在这种情况下,实现该方法就足够了(但您仍然应该收到警告-setDelegate:

于 2013-05-23T22:39:18.630 回答
1

尽管文档说了什么,但如果您查看 Cocoa 对 and 的实际定义initWithRequestconnectionWithRequest它们的定义如下:

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;

正如您将看到的,该delegate参数被定义为id没有指定任何显式的正式协议,因此,如果您传递给它的对象没有被定义为符合任何特定协议,您将不会收到警告.

因此,在回答您的问题时,在这种特殊情况下,您不必定义委托符合任何特定协议。在许多其他情况下,该delegate属性被定义为采用符合适当协议的指针,因此如果您的对象不符合,编译器会警告您。但在这种情况下不是。

不用说,您可能应该继续定义您要遵守的协议,因为它使您的代码更清晰,并且当您开始编写其中之一时,您至少会享受 Xcode 中更好的自动完成功能方法。但你的问题不是你是否应该(你应该),而是你是否必须(你不应该)。

澄清一下,在 iOS 中,现在有两个NSURLConnection协议,NSURLConnectionDataDelegateNSURLConnectionDelegate. (这可能是他们没有在方法声明中定义协议的原因,以避免与将某些方法转移到此NSURLConnectionDataDelegate协议中的混淆。)

于 2013-05-24T04:26:28.060 回答