【问题标题】:delegate declared in interface/protocol?在接口/协议中声明的委托?
【发布时间】:2011-07-06 14:22:15
【问题描述】:

你能帮我理解一下代表和协议吗:
在这段代码中:

          @protocol FirstViewControllerDelegate;  
            @interface FirstViewController : UIVIewController {
            …
            id<FirstViewControllerDelegate> delegate;
            }
            @property (assign) id <FirstViewControllerDelegate> delegate;
  • 第一行“@protocol”是什么意思?我在我的项目中没有看到这个委托文件,并且当前文件(带有@interface)似乎是我的 FirstViewController 的“简单”接口,所以我有点困惑。
  • 我已经看到了如何使用委托模式,但我从来没有看到我们需要在 .h 中“声明”委托,它是不是必须写在 .h 文件中的东西(我是谈论 id delegate) ?

感谢您的回答

保罗

【问题讨论】:

    标签: objective-c delegates protocols


    【解决方案1】:

    @protocol FirstViewControllerDelegate;
    

    这种格式是前向声明。它告诉编译器FirstViewControllerDelegate 是一个有效的协议,稍后将定义(有时只是在同一个.h 文件中更进一步)。这是必需的,因为没有它,编译器会在看到该行时抱怨

    id<FirstViewControllerDelegate>
    

    因为它没有看到它的声明。

    实际的协议可能被定义为类似

    @protocol FirstViewControllerDelegate
    {
    @required
      - (void)myImportantDelegateMethod;
    }
    

    【讨论】:

    • 好的,谢谢!以及关于 id <...> 为什么需要它?
    • 它告诉编译器尽管它可以是任何类型的对象id它应该符合&lt; ... &gt;中的协议
    • 哦,顺便说一句,你能告诉我最后一件事吗:我们通常将委托属性设置为特定对象,但是如果我们只是在这里声明委托,它将委托“自身” ?因此:uiviewController?我认为当它委托特定操作时更容易理解它,但是在这里,我不确定它的作用。感谢您的回答
    • 委托属性声明为id,因为我们不知道哪个对象将充当委托并符合我们的协议。属性声明的&lt; ... &gt; 部分告诉编译器确保分配给delegate 的对象实现协议。如果在我们的类中,我们在协议中定义了一个@required 方法,我们的对象并不关心分配了delegate 的对象是什么类型(因此是id),但只有遵循我们的协议(&lt; ... &gt;)并实现我们所需的方法。
    • 好的,如果我们使用协议,我们必须将它与委托一起使用,对吗?感谢您的解释;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多