更新:代表不必遵守协议。协议只是使要求某些类具有方法变得更加容易。它可以让您确定一个已设置为委托的对象实现了某个方法,因此您可以安全地调用它,并允许编译器验证该方法确实已实现(如果您将委托实例变量声明为id<SomeProtocol> delegate
,编译器将如果您尝试设置delegate
为不符合的类的对象,则给出警告或错误SomeProtocol
。
协议有助于确保安全,但并非绝对必要。一个类可以有一个委托(或多个!),它们根本不必遵守任何协议。
至于插座,不,它们是专门用于且仅与 Interface Builder 一起使用的。IBOutlet
and关键字对IBAction
代码没有影响(它们甚至在编译之前就被去掉了)——它们只是 Interface Builder 寻找的标记,因此它知道哪些属性和方法应该在接口中可访问。术语“出口”是对标记为 的东西的直接引用IBOutlet
,并且实际上没有用于我可以告诉的任何其他上下文中。
同样,如果您不立即理解这一点也没关系。仔细考虑一下,在某些时候,它会“点击”。追了半天,就这样,有一天,我才发现,代言人真的没有什么特别的。它们是其他对象引用的常规对象——只是这种设计模式有一个特殊的名称(委托),而这些对象仅称为委托。它们可以很容易地被称为gyros
or falafels
,并且净效果是一样的。:P
你不需要delegate
为它命名一个对象来成为一个委托;这只是一个约定。
关于代表:首先要了解,这让我有一段时间,直到我有正确的“啊哈!” 时刻,“代表”没有什么特别之处。“委托”一词只是另一个类所依赖的一类对象的标题,通常用于内容或决策。当开发人员不想(或不能)通过名称将他们的一个类绑定到另一个类时,他们将使用委托 - 这是一种面向对象的解耦方式并使类更通用。
现在,很多时候,类将要求委托具有它们所依赖的特定方法,而确保这一点的一种方法是使用协议(通常称为 Java 中的接口)。协议定义了一系列方法;类“符合”协议,如果他们在他们的接口中声明他们这样做(例如@interface IFObject : NSObject <SomeProtocol> { ... }
)并且如果他们实现了他们需要的所有方法。协议也可以有可选的方法。
该模型通常与视图控制器、视图和 GUI 一起使用,因为许多 AppKit 和 UIKit 类被编写为尽可能通用。NSTableView
,例如,实现它可能实现的最基本的行为,而不需要任何特定于实现的信息;其余的,它依赖于其他对象,即符合NSTableViewDelegate
和NSTableViewDataSource
协议的对象。任何对象都可以符合协议,只要它们实现了正确的方法(在这种情况下,控制器类通常会实现两种协议的方法,但不必如此)。事实上,更好地理解这个主题的一个简单方法是看一下NSTableView
- 它有一个delegate
属性和一个dataSource
属性,但实际上,它们没有什么不同。delegate
可以被调用monkeyButt
,并且这个概念仍然有效。关键是不要将代表视为黑匣子——它们没有什么特别之处。
代表也可以用于非 GUI 目的;正如您所提到的,一个具体的例子是应用程序委托。NSApplication
发送一个委托通知,让它知道应用程序何时启动(除其他外),因此它可以设置商店。同样,出于任何目的,任何对象都可以成为任何其他对象的委托。这只是一个约定。
简要介绍出口:正如其他人所提到的,出口只是在 XIB 中定义的接口与您的代码之间的连接。它们是让 Xcode 将界面链接到适当元素的一种方式,这样当您的应用程序加载界面文件时,它可以加载正确的代码片段或执行它们。
它们通常是设置界面的一种更简单的方法 - 它们不是绝对必要的(您可以通过编程方式创建界面,而无需使用 XIB 文件),但如果您决定采用 XIB 路线,它们就是您的方式将您的界面与您的代码联系起来。