我用调用类作为委托创建了一个 NSURLConnection。在意识到我从未将对象声明为遵守协议之前,我将它构建到我的测试设备上,但它运行了(我会说正常,但我认为我完全把我的应用程序搞砸了多个线程)。
那么是否不需要将对象声明为实现委托?
我也没有包含所有必需的委托方法,它仍然称为委托方法。
这个项目还有其他人,而且它相当大,所以也许委托协议被声明在某个模糊的地方,但我在标题和实现声明中搜索它时没有看到它。
我用调用类作为委托创建了一个 NSURLConnection。在意识到我从未将对象声明为遵守协议之前,我将它构建到我的测试设备上,但它运行了(我会说正常,但我认为我完全把我的应用程序搞砸了多个线程)。
那么是否不需要将对象声明为实现委托?
我也没有包含所有必需的委托方法,它仍然称为委托方法。
这个项目还有其他人,而且它相当大,所以也许委托协议被声明在某个模糊的地方,但我在标题和实现声明中搜索它时没有看到它。
该方法的delegate
参数NSURLConnection initWithRequest:delegate:
使用类型定义id<NSURLConnectionDelegate>
。
如果您传递一个未声明它符合 的对象NSURLConnectionDelegate
,您应该得到一个编译器警告,表明您传递了错误类型的对象。仔细检查您是否收到任何警告。如果不是,那么您的类在某个地方正确声明它符合协议。
在运行时,唯一的要求是委托对象实际上至少实现了委托所需的方法。但在这种情况下,协议中没有必需的方法。它们都是可选的。
您说:“我也没有包含所有必需的委托方法,它仍然称为委托方法。” 这没有意义。如果您不实施它们,如何调用它们?另外,协议中没有必需的方法。
我认为这取决于如何NSURLConnection
实施。首先,如果setDelegate:
方法/属性设置为接受 type 的对象id<NSURLConnectionDelegate>
,那么编译器应该警告你。如果NSURLConnection
源代码在调用任何协议方法之前使用(例如)检查委托+conformsToProtocol:
,则不应回调您的对象。
编辑:rmaddy 补充说协议中的所有方法都是可选的。既然如此,那么NSURLConnection
很可能使用 (instance)-respondsToSelector:
而不是 (class)进行检查+conformsToProtocol:
。在这种情况下,实现该方法就足够了(但您仍然应该收到警告-setDelegate:
)
尽管文档说了什么,但如果您查看 Cocoa 对 and 的实际定义initWithRequest
,connectionWithRequest
它们的定义如下:
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
正如您将看到的,该delegate
参数被定义为id
没有指定任何显式的正式协议,因此,如果您传递给它的对象没有被定义为符合任何特定协议,您将不会收到警告.
因此,在回答您的问题时,在这种特殊情况下,您不必定义委托以符合任何特定协议。在许多其他情况下,该delegate
属性被定义为采用符合适当协议的指针,因此如果您的对象不符合,编译器会警告您。但在这种情况下不是。
不用说,您可能应该继续定义您要遵守的协议,因为它使您的代码更清晰,并且当您开始编写其中之一时,您至少会享受 Xcode 中更好的自动完成功能方法。但你的问题不是你是否应该(你应该),而是你是否必须(你不应该)。
澄清一下,在 iOS 中,现在有两个NSURLConnection
协议,NSURLConnectionDataDelegate
和NSURLConnectionDelegate
. (这可能是他们没有在方法声明中定义协议的原因,以避免与将某些方法转移到此NSURLConnectionDataDelegate
协议中的混淆。)