objective-c - 对象之间的通信——将自身传递给另一个对象/Objective-C、Cocoa

标签 objective-c cocoa xcode

假设我们有第一个对象“Controller”,它初始化另一个名为“Tasks”的对象,同时传递“self”以供引用。任务对象现在可以与 super “ Controller ”对象通信和发送消息。这对于对象之间的通信是否正确?这通常是这样做的吗?我刚刚开始真正学习编程,所以我想知道这是否可以。到目前为止,我一直依赖委托(delegate)和通知。这是好的做法吗?

例子:

// Controller Object
task = [[Task alloc] initWithController: self];
- (void) runMethod: (NSString *) incoming {
NSLog(@"%@", incoming);
}

// Task Object
- (id) initWithController: (Controller *) ctrlr {
controllerPointer = ctrlr;
[controllerPointer runMethod:@"hello"];
return self
}


// All this should print out "hello"

对象之间还有其他通信、交互方式吗?

最佳答案

这不是 Controller 对象(在您的示例中为 Controller)和模型对象(Task)通常交互的常用方式。对模型- View - Controller (MVC) 模式有多种解释,但一般来说, Controller 对象观察或查询模型对象,而不是依赖模型来了解它们的 Controller 是谁并期望它们直接通信和他们在一起。

您的设计在模型和 Controller 对象之间建立了不必要的紧密联系。例如,如果您决定添加第二个 Controller 来管理不同的任务 View ,将来会发生什么情况?您的 Task 对象是否必须管理与多个 Controller 的通信?如果您有大量模型对象,最终可能需要编写大量代码。

在 Cocoa 中,模型对象有两种主要方式向程序的其余部分通告感兴趣的事件:通知和键值观察 (KVO)。通知非常简单。您使用名称和相关模型对象创建通知,然后将其发布到共享的 NSNotificationCenter。从那里,通知中心负责将消息传递给订阅它们的任何对象。

KVO 比较难解释。本质上,在幕后,Cocoa 有一种机制来检测对象的变化并将更新的值直接发送到观察它们的类。 (KVO 也作为 Cocoa Bindings 基础的一部分,遗憾的是它不存在于 iPhone SDK 中)

不过,这两种技术的共同点是它们提供了一种通用机制,用于通知任何其他对象模型对象中发生了一些有趣的事情。这些对象选择如何响应完全是它自己的决定。

这种分离使得 Controller 对象和模型对象之间的依赖性降低,这意味着作为程序员,您可以更少地担心 Controller 层和模型层之间的特定交互。

关于objective-c - 对象之间的通信——将自身传递给另一个对象/Objective-C、Cocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/949032/

相关文章:

objective-c - 设置 NSDocument 以保存非 native 类型

ios - 在 UISlider 的拇指图像上不断改变 UILabel 的值

ios - 为什么这个循环不退出

iphone - iOS 5 中的单元测试 : Is there a way to remove STAssertTrue() lines from the editor temporarily?

xcode - 如何在 Swift 中以编程方式添加约束

c - 打印内存位置时 Printf 产生警告但仍在 xcode 中编译和运行

ios - 核心数据迁移错误 Cocoa error 134130 Can't find model for source store

ios - 从类中删除所有观察者

objective-c - 如何使 NSControl(例如 NSTokenField)忽略鼠标事件

ios - 使用 Cocos2d-x 打开游戏中心 UI