【发布时间】:2009-06-14 04:45:45
【问题描述】:
在编写 Cocoa 并实现一个接受委托和一个或多个选择器用于其回调的类方法时,术语是否从“委托”和“选择器”更改为“目标”和“动作”?更重要的是,“代表”是否仅限于当我的班级被调用时,而不是当我的班级进行调用时?
【问题讨论】:
标签: objective-c cocoa cocoa-touch macos
在编写 Cocoa 并实现一个接受委托和一个或多个选择器用于其回调的类方法时,术语是否从“委托”和“选择器”更改为“目标”和“动作”?更重要的是,“代表”是否仅限于当我的班级被调用时,而不是当我的班级进行调用时?
【问题讨论】:
标签: objective-c cocoa cocoa-touch macos
委托通常使用Protocols 而不是选择器来实现。这是一种更正式的跨类通信方式,并且在可能需要多个方法时非常有用。
Target/Action 一般用于对应“类事件”的情况,比如点击、定时器触发等。
【讨论】:
为了详细说明 NilObject 的答案,委托是通过具有一系列“标准化”方法的协议实现的。如果您有多个对象,每个相同的类共享相同的委托,您将无法区分发送者。因此你看到 -(void)delegateCallback:(id)sender 发送者的指针允许你建立这个关联。
为了进行这种比较,将需要对 sender 的引用作为属性或全局变量,如果您手动释放对象,这也会使您更容易,因为您可以在释放之前将对象属性设置为 nil(以防止垃圾指针)。
或者,您可以使用选择器方法传入自己的回调方法,这种技术很好,因为您不需要参考来与 :(id)sender 进行比较,并且您可以为每个方法回调您初始化的对象。另一方面,缺少引用意味着如果您释放此对象,您将无法将属性设置为 nil。
【讨论】:
我认为在设计层面存在差异。
让我们用一个专门做一些事情的组件。 Delegation 和 targetAction 都会促进我们的组件和使用它的对象之间的(某种形式的)通信。
通常,所需的通信形式定义是使用Target Action 还是Delegation。
1.传达了什么?
Target Action 更适用于通信仅限于控制(事件、状态等)的情况
委托更加灵活,应用广泛。所以我可以使用委托在 2 个对象之间发送和接收 数据。
2。如何
到目前为止,我已经看到 Target Action 主要体现 1-Way 通信
通过委托,我自己通过返回值的方法完成了 2-Way 通信。
【讨论】:
Target - 将对您的操作做出响应的对象。 Action - 由您的操作触发的方法 Delegates - 主要用于回调机制,使用“@protocols”实现。 选择器 - 也可以用作回调方法:
例如:
SEL mySelector = @selector(myTimerCallback:);
[NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
【讨论】: