对象之间的简单通信NSNotification /代表或类似的?

时间:2012-09-26 11:22:41

标签: objective-c opencv delegates nsnotifications

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

假设我有一个Object,我们称之为 aTimcode 从main()实例化类“Timecode”,这是一个存储时间码的类(例如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];

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

// somewhere within aVideo

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

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

但是当程序进一步发展时,我想要很多视频对象( bVideo cVideo 等...)来贡献 aTimecode中的值并使用之前存储的数字进行数学运算。即使aVideo被发布并且bVideo开始做一些事情, aTimecode 也应该存储它们。

什么是正确的沟通方式?代表们? NSNotification?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

如果Timecode对象是某个Video对象的参数,则不一定必须释放它。您可能希望创建一个单独的类,将Timecode对象保留在其中,并将弱引用传递给所有创建的Video对象,之后您可以使用KVO,NSNotifications或委托,无论您最喜欢哪个。但是,代表团似乎是最明智的解决方案。