【问题标题】:Delegating with or without the need to implement a protocol.. what's the rationale behind?是否需要执行协议进行委派.. 背后的基本原理是什么?
【发布时间】:2011-09-03 08:48:08
【问题描述】:

我对指定委托的类有疑问。

有时委托对象需要实现协议,有时不需要。例如,如果要显示 UIAlertView,则创建它时指定 delegate,例如 self。然后,调用UIAlertView 的类必须实现UIAlertViewDelegate 协议。

如果您使用connectionWithRequest:delegate: 消息创建其他类,例如NSUrlConnection,则指定一个委托,它将在连接进行时接收从NSUrlConnection 发送的委托消息,但指定为委托的对象没有实现一个协议。

我错过了什么吗?我如何理解何时应该实施协议?从 API 参考中是否总是像 UIAlertViewDelegate 一样清楚?

我注意到UIAlertView 参考仅提供实例方法并告诉您必须实现UIAlertViewDelegate 协议,而NSUrlConnection 没有谈论要实现的协议,但它有一个委托方法部分。

NSUrlConnection 是否可以像UIAlertView 类一样定义,没有委托方法但使用NSUrlConnectionDelegate 协议。

还是我错过了重点?在我看来,出于相似目的有两种不同的方式,但也许我错了。我希望我已经很清楚了,我只是想完全理解这些东西背后的基本原理。

【问题讨论】:

    标签: objective-c ios delegates uialertview nsurlconnectiondelegate


    【解决方案1】:

    NSURLConnection 本身实现了委托方法,为这些事件提供了一些默认行为。

    默认情况下,UIAlertView 根本不处理这些事件。并允许您制作委托来自定义处理。

    区别在于是否需要默认行为。

    【讨论】:

    • 但是API参考中委托方法部分的方法是“标准方法”,它们被简单地指定为委托方法,让您(开发人员)了解它们可以由委托对象实现?所以基本原理是 1)如果类本身实现了某些东西但允许其委托覆盖默认行为,则不需要协议,而 2)如果类本身没有实现默认行为并且您可以/必须实现一些方法指定的委托类,那么你就得遵守一个协议,对吗?
    • 请参阅协议和类别:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… 类别可以为类提供额外的方法,您可以在委托的情况下,将其想象为默认实现。协议可能会要求您实现可选或必需的方法。 NSURLConnectionDelegate 被定义为 Category(其 API Reference 将这些方法标记为“委托方法”),而 UIAlertViewDelegate 被定义为协议。
    • 您陈述的理由是正确的。协议和类别都有助于减少子类化。
    • 呃...我没有看到有NSURLConnectionDelegate protocol...这让我感到困惑...是connectionWithRequest中指定的委托对象:delegate:实现NSURLConnection的消息协议 NSURLConnectionDelegate(即 connectionWithRequest:delegate: 方法是否检查委托对象是否符合该协议)..?
    • NSURLConnectionDelegate 不是协议。导航到 Xcode 中的 NSURLConnectionDelegate 定义(cmd+双击)。你可以看到它在 NSURLConnection.h 中并且是 NSObject 的一个类别。
    猜你喜欢
    • 2017-03-09
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-05-18
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多