傻瓜的协议和代表

时间:2012-01-06 13:39:39

标签: objective-c design-patterns delegates protocols

我试图弄明白我保证!这里有大量的信息,我仍然充斥着抽象概念的海洋!就像我小时候一样,没有人可以向我解释为什么一个国家不能只打印更多的钱而且真的很富裕。我不是因为大部分这些东西都迟钝了,但由于某种原因我无法围绕这个概念,所以如果有人可以把它拼写为“尽可能慢地和一个4岁的孩子说话”,我会非常感激。 !

我认为目标行动对我来说完全合情合理。这是一种允许视图与控制器通信的有用方法,而不必做很多事情。据我所知,控制器对象有效地将侦听器附加到视图对象,以便如果在该视图上发生特定事件(即按钮被按下),则它会触发控制器方法。这可能不是技术上准确的,但作为一个抽象的解释,它对我来说是有道理的。

所以顺序是:

  1. 在控制器对象中创建目标方法。
  2. 选择一个视图并以图形方式连接到该方法。
  3. 该视图上发生的事件会从控制器触发该方法。
  4. 协议和代表让我感到沮丧。我知道它与允许对象相互交谈有关,但我尝试写下目前为止我的(缺乏)理解并删除它,因为我认为最好不要解开我当前思路中的结,而只是擦拭板岩并重新开始。如果有人可以花一点时间来解释

    的目的
    1. 使用委托/协议而不是目标/操作
    2. 代码的组成部分及其居住地
    3. 使用该过程时发生的事件序列
    4. 我会永远感激。

      根据对其他解释的一些评论来判断,我觉得我不是唯一一个有点迷失的人,所以希望这将是一般用途。非常感谢!

      编辑:

      好吧,我想如果我只是理解我的理解,人们可以纠正我,这可能会让我更容易。

      我的样本来自Apple Docs,一个Window作为视图对象,WindowDelegate作为委托,点击关闭窗口按钮会触发“我应该关闭吗?”给代表的消息。

      守则的成分: 窗口(查看) WindowDelegate(View Controller?)

      1. 声明委托可以在Window(View)的接口部分使用的协议。
      2. 在窗口中创建委托的实例。
      3. 声明WindowDelegate通过在其界面中包含:来实现Window Protocol。 (这里有点摇摇欲坠?)
      4. 在WindowDelegate(View Controller)实现部分中编写方法的必要实现。
      5. 在某个特定事件中,Window将使用某些信息向WindowDelegate发送消息。
      6. WindowDelegate将处理此问题并返回答案。
      7. 沿着右边的任何地方?

4 个答案:

答案 0 :(得分:3)

这里有很多东西,听起来你有一些困惑。

首先,我建议你去Apple开发者网站下载学习目标-C:入门和Objective-C编程语言书籍。暂时忽略目标/动作界面接线,因为听起来你需要了解目标C的一些基础知识。在这里你可以找到有关Protocols等的所有内容以及其他面向对象的东西。

其次,有很多非常好的书籍会带你逐步开发一个应用程序。开始iPhone 4开发:探索iOS SDK是一个受到好评的。这也是您将了解代表的地方。

第三,再花一些时间回到文档中。 SDK文档包含大量文章,概述了基本级别的工作方式,Apple开发人员网站也有很多。

答案 1 :(得分:2)

存在代表以帮助您避免子类化。

子类化是你应该总是试图避免的,因为它是一种非常紧密的耦合形式。耦合是当两个对象相互依赖以正常工作时,您拥有的耦合越多,对程序进行更改就越困难(因为每当您必须更改一个对象时,您将被迫更改其他对象取决于它的对象。)

子类化是一种耦合形式的原因是因为当你从超类继承子类时,你的子类将依赖于超类的方法(子类继承的方法)。因此,如果您必须更改超类,那么您可能必须使用它来更改所有子类。

假设你想拥有一堆完全相同的对象,除了他们用一种方法做的事情。通过子类化,你必须创建一堆不同的子类并在所有子类上覆盖一个方法,这将是很多子类化(和不需要的耦合)。这是委托进来的地方。你可以简单地创建一个类,并将其设计为拥有匿名类型id的对象,而不是子类的子类,它将是委托对象(我们称之为委托对象)孩子)。此子对象将具有以前在父对象中的单个唯一方法,但现在父对象将在子对象上触发该方法。

因此,我们创建了一组不同的委托对象,而不是子类很多次,我们可以做,因为类型id没有指定我们的对象类型必须使用。每个不同的委托对象以不同的方式实现该方法,并且我们避免使用子类化。

答案 2 :(得分:0)

要了解代理人,请查看Cocoa提供的代理人。 例如,NSWindow有一个名为的委托方法    - (void)windowWillClose:(NSNotification *)aNotification 如果您实现该委托方法,则查看通知以确定将关闭哪个窗口并对该窗口执行一些清理。您是NSWindow对象的委托,因为您正在为窗口对象做一些工作。

所有Cocoa委托方法的名称都包含诸如“did”,“will”,“should”等字样。它们使代码能够执行特殊操作以及通过那些对象本身 - 因此你是这些对象的代表。

答案 3 :(得分:-1)

对于代表,您可以查看this question

对于协议,您可能需要查看this question或查看documentation

希望这有帮助!

相关问题