假设我们有一个第一个Object'Controller',它初始化另一个名为'Tasks'的对象,同时传递'self'以供参考.Tasks对象现在可以与超级'Controller'对象进行通信并发送消息.这对于对象之间的通信是否正确?这通常是怎么做的?我刚刚开始真正学习编程,所以我想知道这是否正常.到目前为止,我依靠代表和通知.这是好习惯吗?
例:
// 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
在您的示例中)和模型对象(Task
)通常交互的常用方式.对模型 - 视图 - 控制器(MVC)模式有各种各样的解释,但一般来说,控制器对象会观察或查询模型对象,而不是依赖模型来知道控制器是谁以及期望它们直接通信跟他们.
您的设计会在模型和控制器对象之间创建一个不必要的紧密链接.例如,如果您决定添加第二个控制器来管理不同的任务视图,将来会发生什么?您的Task
对象是否必须管理与多个控制器的通信?如果您拥有大量的模型对象,那么最终可能需要编写大量代码.
在Cocoa中,模型对象有两种主要方式来通知程序其余部分感兴趣的事件:通知和键值观察(KVO).通知很简单.您使用名称和相关模型对象创建通知,然后将其发布到共享NSNotificationCenter
.从那里,通知中心负责将消息传递给订阅它们的任何对象.
KVO有点难以解释.基本上,在幕后,Cocoa有一种机制,用于检测对象的更改并将更新的值直接发送到观察它们的类.(KVO也是Cocoa Bindings基础的一部分,遗憾的是,它不存在于iPhone SDK中)
然而,这两种技术的共同之处在于它们提供了一种通用机制,用于通知任何其他对象在模型对象中发生了某些感兴趣的事情.这些对象如何选择响应完全是它自己的决定.
这种分离使得控制器对象和模型对象之间的依赖性降低,这意味着作为程序员,您可以更少地关注控制器和模型层之间的特定交互.