objective-c - 对 Objective-c View 、代表和导出的混淆

标签 objective-c cocoa design-patterns cocoa-design-patterns

我正在尝试自学 Objective-c,但来自 Python/Java 背景,事实证明这非常困难。我试图发表一些我感到困惑的观点,但它被标记为太模糊,所以我将把它分成几个部分。

首先,我发现的每个委托(delegate)和 socket 的例子都使用 cocoa View 代码来传达这个想法。不幸的是,我对代码的理解还不足以掌握示例的要点。那么,谁能提供一个更基本的委托(delegate)示例?我的理解是这是一种子类化的方式;这比传统的子类化更好吗?为什么每个 cocoa 项目都会自动包含 appDelegate.m?委托(delegate)可以用于其他目的,而不仅仅是 GUI 的东西吗?

好吧,我想我明白了。所以委托(delegate)是一个符合其他类协议(protocol)的类。协议(protocol)只是必须(或可以,如果设置为可选)在委托(delegate)类中实现的方法和变量的列表。要进行委托(delegate),您必须使用@interface 关键字,然后是委托(delegate)的名称,然后(在< > 符号中)协议(protocol)名称?那么如果类c1想要将自己设置为类c的委托(delegate),那么类c必须先指定一个协议(protocol),对吗?然后,您将能够在 c1 中实现 c 协议(protocol)中的所有内容:
@接口(interface)c1;
我觉得我在那里遗漏了一些东西,但希望我的概念是正确的。 :) 这也解释了神秘的小于和大于符号;它们声明委托(delegate)实现的接口(interface)。

导出同样总是与查看代码相关联。它们似乎是某种对象间消息传递系统。是吗?同样,一个没有混合复杂 GUI 语句的基本 socket 的例子会很棒。
所以永远不需要 socket ?我知道除了与 Interface Builder 一起使用外,不需要 IBOutlet 和 IBAction,但我认为 socket 比这更通用?文档似乎表明它们甚至不是专门用于接口(interface)的,但可以用于任何东西。

在此先感谢您的帮助。

最佳答案

更新 :代表不必遵守协议(protocol)。协议(protocol)只是使要求某些类具有方法更容易。它允许您确定已设置为委托(delegate)的对象实现了某个方法,以便您可以安全地调用它,并允许编译器验证该方法确实已实现(如果您将委托(delegate)实例变量声明为 id<SomeProtocol> delegate ,如果您尝试将 delegate 设置为不符合 SomeProtocol 的类的对象,编译器将给出警告或错误。

协议(protocol)有助于确保安全,但并非绝对必要。一个类可以有一个委托(delegate)(或多个!),而且它们根本不需要遵守任何协议(protocol)。

至于 socket ,不,它们专门且仅与 Interface Builder 一起使用。 IBOutletIBAction关键字对代码没有影响(它们甚至在编译之前就被剥离了)——它们只是 Interface Builder 要查找的标记,因此它知道应该在接口(interface)中访问哪些属性和方法。术语“ socket ”是对标记为 IBOutlet 的东西的直接引用。 ,并且实际上没有用于我可以分辨的任何其他上下文。

再次 ,如果你不马上明白这一点也没关系。仔细考虑一下,在某些时候,它只会“咔哒”一声。我被代表追了很久,就这样,直到有一天,我意识到代表真的没什么特别的。它们是其他对象引用的常规对象——只是这种设计模式有一个特殊的名称(委托(delegate)),而这些对象仅称为委托(delegate)。他们可以很容易地被称为 gyrosfalafels ,净效果是一样的。 :P
您不需要命名对象 delegate使其成为代表;这只是一个约定。

关于代表:首先要理解的是,这让我花了一段时间,直到我有了正确的“啊哈!”时刻,是“代表”没有什么特别之处。 “委托(delegate)”一词只是另一个类所依赖的一类对象的标题,通常用于内容或决策。当开发人员不想(或不能)通过名称将他们的一个类绑定(bind)到另一个类时,他们将使用委托(delegate) - 这是一种面向对象的解耦方式并使类更通用。

现在,类经常需要委托(delegate)拥有它们依赖的特定方法,而确保这一点的一种方法是使用协议(protocol)(在 Java 中通常称为接口(interface))。协议(protocol)定义了一个方法列表;如果类在它们的接口(interface)中声明它们符合协议(protocol)(例如 @interface IFObject : NSObject <SomeProtocol> { ... } )并且它们实现了它们需要的所有方法,则它们“符合”协议(protocol)。协议(protocol)也可以有可选的方法。

这个模型通常与 View Controller 、 View 和 GUI 一起使用,因为许多 AppKit 和 UIKit 类被编写为尽可能通用。 NSTableView例如,实现它可能实现的最基本的行为,而不需要任何特定于实现的信息;其余的,它依赖于其他对象,那些符合 NSTableViewDelegate 的对象。和 NSTableViewDataSource协议(protocol)。任何对象都可以符合协议(protocol),只要它们实现了正确的方法(在这种情况下, Controller 类通常会实现两种协议(protocol)的方法,但不一定如此)。事实上,更好地理解该主题的一种简单方法是查看 NSTableView - 它有一个 delegate属性(property)和dataSource属性,但实际上,它们并没有什么不同。 delegate可以叫monkeyButt ,并且这个概念仍然有效。关键是不要将委托(delegate)视为黑匣子——它们没有什么特别之处。

代理也可用于非 GUI 目的;正如你提到的,一个具体的例子是应用程序委托(delegate)。 NSApplication发送一个委托(delegate)通知,让它知道应用程序何时启动(除其他外),以​​便它可以建立商店。同样,出于任何目的,任何对象都可以是任何其他对象的委托(delegate)。这只是一个约定。

关于 socket 的简要介绍:正如其他人所提到的, socket 只是在 XIB 中定义的接口(interface)和您的代码之间的简单连接。它们是一种让 Xcode 将界面链接到适当元素的方式,以便当您的应用程序加载界面文件时,它可以加载正确的代码段或执行它们。

它们通常是设置接口(interface)的一种更简单的方法 - 它们不是绝对必要的(您可以通过编程方式创建接口(interface),而无需使用 XIB 文件),但是如果您决定采用 XIB 路线,它们就是您的方式将您的界面与您的代码联系起来。

关于objective-c - 对 Objective-c View 、代表和导出的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14463389/

相关文章:

objective-c - 想要一个关于如何在 Cocoa/Objective-C 中连接到 SQLite 数据库的简单概述

objective-c - 将单词列表字典加载到数组中的最快方法?

ios - 使用 UISlider 应用 GPUImage 过滤器

c - Cocoa app 和 C 端 app 之间的进程间通信

php - 以编号格式创建许可证 key 问题

c# - 多步算法的设计模式

design-patterns - 使用抽象工厂的缺点以及解决它的模式

objective-c - Http 日期到 NSDate

ios - 保持用户登录(重试 HTTP 请求)

c++ - 服务器处理客户端请求应使用哪种 OOD 设计模式?