【问题标题】:Simple Communication between Objects NSNotification/Delegates or similar?对象 NSNotification/Delegates 或类似对象之间的简单通信?
【发布时间】:2012-09-26 11:22:40
【问题描述】:

我刚开始使用 Objective C,并且有一个关于两个对象之间通信的问题。

假设我有一个对象,我们称它为 aTimcode,它是从“时间码”类中的 main() 实例化的,该类是一个存储时间码的类(例如 01:30:20:10)和具有减少/增加此时间码的方法以及更多使用时间码进行数学运算的方法。

我有第二个对象,我们称之为“视频”类中的 aVideo,它在视频上执行一些 (openCV) 内容,也是在 main() 中创建的。

所以我的 main() 看起来像:

Timecode *aTimecode = [[Timecode alloc] init];
Video    *aVideo    = [[Video alloc] init];
[aVideo doFancyOpenCVSTUFF: someparameter];

我现在希望 aVideo 调用 aTimecode 上的方法。像

[aTimecode increaseFramesBy: 5];

我知道建立通信的简单方法是在 aVideo 中实例化 aTimecode:

// somewhere within aVideo

Timecode * aTimceode = [[Timecode alloc] init];
[aTimecode increaseFramesBy: 5];
[aTimecode release];

但这当然会破坏存储在aTimecode中的信息。

但是当程序更进一步时,我希望有很多 Video 对象(bVideocVideo 等)为 aTimecode 中的值做出贡献 并对之前存储的数字进行数学运算。 aTimecode 应该存储它们,即使 aVideo 被发布并且 bVideo 开始做一些事情。

什么是正确的沟通方式?代表? NS通知?

可能存在这样的情况,例如 aVideoaTimecode 发送大量消息 - 每秒 10 次或更频繁。在短时间内发送这么多消息的正确方法是什么?

【问题讨论】:

    标签: objective-c opencv delegates nsnotifications


    【解决方案1】:

    根据您的描述,在Video 类中创建initWithTimecode: 方法似乎最简单。

    这假定 Video 使用 Timecode 方法,而不是可能是 Timecode 的一部分或可能是其他东西的一部分的方法。如果这是错误的并且您需要传入各种对象类型,那么您将使用协议和委托。

    如果Video 只是声明某些事件已经发生并且不关心是否有任何其他(或许多)对象注意到它们,则通知会更合适。

    【讨论】:

      【解决方案2】:

      如果 Timecode 对象是某个 Video 对象的参数,则不一定要释放。您可能希望创建一个单例类,将 Timecode 对象保存在其中,并将对它的弱引用传递给所有创建的 Video 对象,之后您可以使用 KVO、NSNotifications 或委托,无论您最喜欢哪种。不过,委托似乎是这里最明确的解决方案。

      【讨论】:

      • @Philip Mills - 感谢您提供超快速且非常有用的答案!!!将首先尝试使用 initwithTimecode。
      猜你喜欢
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      相关资源
      最近更新 更多