2012-09-26 68 views
0

我剛開始使用Objective C,並且有兩個對象之間的通信問題。對象之間的簡單通信NSNotification/Delegates還是類似的?

說我有一個對象,我們稱之爲aTimcode從類「Timecode」中的main()實例化,它是一個存儲Timecode(例如01:30:20:10)的類,並且有方法de /增加這個時間碼和一些與時間碼相關的方法。

我有第二個對象,可以叫它aVideo從類「視頻」,做一些(openCV)的東西在一個視頻,也在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信息的釋放。

但是當程序更進一步我想了很多視頻對象(bVideocVideo,等...)的aTimecode作出貢獻的價值觀和做數學與預先存儲的號碼。 aTimecode應該存儲他們,即使視頻被髮布和bVideo開始做一些東西。

什麼是正確的溝通方式?代表們? NSNotification?

有可能是,例如aVideo發送大量消息來aTimecode情況 - 每秒10次或更多次。在短時間內發送這麼多消息的正確方式是什麼?

回答

0

從你所描述的,在Video類中創建一個initWithTimecode:方法似乎是最簡單的。

這假定Video使用Timecode方法,而不是可能是Timecode的一部分的方法,也可能是其他方法的一部分。如果這是錯誤的,你需要傳入各種對象類型,那麼你會使用一個協議和一個委託。

如果Video只是聲明發生了某些事件,並不關心其他任何對象(或多個)是否注意到它們,則通知將更合適。

0

如果Timecode對象是某個Video對象的參數,則該對象不一定必須被釋放。您可能希望創建一個單獨的類,該類將Timecode對象保留在其中,並將弱引用傳遞給所有創建的Video對象,然後您可以使用KVO,NSNotifications或委託,無論您最喜歡哪一個。但是,代表團似乎是最明智的解決方案。

+0

@菲利普米爾斯 - 感謝超快速和非常非常有幫助的答案!首先嚐試使用initwithTimecode。 – kava