在cocoa編程中,我們經常會遇到delegate、Target-Action、notification等等這些方法,我覺得從某種角度看,可以將這些方法總結在一起,它們就是為不同模組間提供協作的方法,這種協作在這裡我把它理解為是“回調”,其實"回調"二字在這裡更多是借用,並沒有認真地去考究過這些正是一堆回呼函數,純粹是覺得挺像,感覺用來說明問題挺方便,所以就借用一下,應用程式層我們常見的"回調"就有以下幾類:
第一:當然是如雷貫耳的delegate,這個沒什麼好說的,教程和文檔說得夠權威仔細了,它主要在"父子"執行個體中會常被用到;
第二:這種方式比較常見,但卻未必會想到它其實也可以理解為是一種“回調”,這就是Target-Action模式;
第三:最任勞任怨的NSNotificationCenter,它以你最舒服的方式提供很令你滿意的服務,它有三個關鍵詞比較重要,observer、sender和name,observer就是notification的接受者,在"註冊method"中會碰到它,經常是self,我也建議是這樣,自己的notification就應該自己去註冊,sender在設定"發送method"中(postNotificationName:object:和postNotificationName:object:userInfo:)的object參數時會見到,這個參數非常重要,它直接影響對NSNotificationCenter 使用的品質,sender是什麼意思,就是notification的"簽名",當在註冊method中我們可以指定僅接受哪個sender的notification,那麼center就是靠"發送method"時的object這個參數所傳的"簽名"來決定怎麼發的,name比較簡單,相當於標題,observer可以而且必須指定接受哪些name的notification,不同name其含義自然不同,在關係比較遠的模組間,NSNotificationCenter很實用;
第四:KVO(Key-Value Observing),這個用得比較少,當B模組對A模組的屬性狀態感興趣時,可以使用這種方法,參考文檔:Key-Value Observing Quick Start;
第五:一個例子就明白了,它其實就是直接將一個對象的指標和方法作為參數傳給另一個對像,讓另一個對象來調用自己,就是這一句:UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:),
nil);
#pragma mark -
#pragma mark UIImagePickerController delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)Info {
UIImage *originalImage = [Info objectForKey:UIImagePickerControllerOriginalImage];
if(nil != originalImage)
{
UIImageWriteToSavedPhotosAlbum(originalImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
...
}
- (void) image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
...
}
以上就是我的一點小小的總結,這些方法在模組間的協作可能會經常使用到的,希望對開始學習cocoa的人們有點協助吧。
轉自:http://www.cnblogs.com/Win-Iphone_QG/archive/2011/02/16.html
大家應該都明白的是委託是協議的一種,顧名思義,就是委託他人幫自己去做什麼事。也就是當自己做什麼事情不方便的時候,就可以建立一個委託,這樣就可以委託他人幫自己去實現什麼方法。
通過上面那段話我們已經瞭解委託的基本原理,用大白話講就是:你的老闆想要做個項目,於是老闆把任務交給了專案經理,可是專案經理卻把寫代碼的事情讓你去做了,這個過程其實就是
專案經理.delegate = 程式員,那麼假如專案經理有了一個oCCoding()任務要程式員做,那麼程式員這個類中就要實現oCCoding()這個方法。
我簡單的總結了一下自己用到的委託的作用有兩個,一個是傳值,一個是傳事件。1.所謂傳值經常用在b類要把自己的一個資料或者對象傳給a類,讓a類去展示或者處理。(切分緊耦合,和代碼分塊的時候經常用)2.所謂傳事件就是a類發生了什麼事,把這件事告訴關注自己的人,也就是委託的對象,由委託的對象去考慮發生這個事件後應該做出什麼反映。(這個經常見,例如在非同步請求中,介面事件觸發資料層改變等等)3.利用委託賦值,這種方法感覺是為了不暴露自己的屬性就可以給自己複值,而且這樣更方便了類的管理,只有在你想要讓別人給你賦值的時候才調用,這樣的賦值更可控一些。(例如tableView中的委託(dateSource)中常見)。最後,我想分享一下在使用委託的時候的一些心得和注意事項。心得:delegate的命名要準確,盡量看名字就知道用法。delegate和通知有的用法有些象,但是前者是單對單的,後者是單對多的情況。注意:在dealloc要把delegate至為nil,還有就是delegate設定屬性的時候要用assign,不要用retain。