0

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

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

我有第二个对象,我们将其称为“视频”类中的视频,它在视频上执行一些(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 发布时破坏存储在 aTimecode 中的信息。

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

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

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

4

2 回答 2

0

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

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

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

于 2012-09-26T11:34:03.563 回答
0

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

于 2012-09-26T11:37:30.307 回答