1.block 一對一的通信,不需要定義協(xié)議方法诵棵;
2.notification 一對多通信 祝旷,通信對象間不需要建立關(guān)系;代碼可讀性差
3.delegate 一對一通信怀跛,需要定義協(xié)議方法,代理對象實現(xiàn)協(xié)議方法忠蝗,并且需要建立代理關(guān)系才可通信
iOS中block和delegate的區(qū)別(面試必問) - CSDN博客
作為非常常見漓拾,且無處不在的block和delegate,理解它們骇两,是我們掌握iOS開發(fā)必備知識點。
1.從源頭上理解和區(qū)別block和delegate
delegate運行成本低哟旗,block的運行成本高栋操。
block出棧需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存饱亮,當然對象的話就是加計數(shù)矾芙,使用完或者block置nil后才消除近上。delegate只是保存了一個對象指針,直接回調(diào)葱绒,沒有額外消耗斗锭。就像C的函數(shù)指針,只多做了一個查表動作岖是。
2.從使用場景區(qū)別block和delegate
有多個相關(guān)方法实苞。假如每個方法都設置一個 block, 這樣會更麻煩烈疚。而 delegate 讓多個方法分成一組,只需要設置一次猾浦,就可以多次回調(diào)灯抛。當多于 3 個方法時就應該優(yōu)先采用 delegate。當1牧愁,2個回調(diào)時,則使用block兔朦。
delegate更安全些磨确,比如: 避免循環(huán)引用沽甥。使用 block 時稍微不注意就形成循環(huán)引用乏奥,導致對象釋放不了。這種循環(huán)引用恨诱,一旦出現(xiàn)就比較難檢查出來骗炉。而 delegate 的方法是分離開的,并不會引用上下文句葵,因此會更安全些。
delegate回調(diào)返回的參數(shù)被限制在了 NS 類的范圍內(nèi)剂碴,數(shù)量也很有限(當然可以用直接調(diào)用方法的形式在繞過轻专,并不推薦;也可以用 Array 套著傳铭若, 不過這樣需要有文檔支持递览,不然不夠清晰瞳腌,回調(diào)方法也需要獨立的驗證,故也不推薦)儿捧。
那如何使用挑宠?
如果你從其他語言轉(zhuǎn)到 Objective-C 或者 Swift ,相信 Delegation 肯定讓你覺得更加親切各淀,那么在初級階段請使用好這個語法糖,多用临谱,多去理解奴璃;如果你用著 AFNetworking 看著其他老前輩的說法用 Block 覺得效率很高很開心,那就開心的用苟穆,直到你被循環(huán)引用煩到了為止;然后雳旅,在你代碼寫多了之后,你可以開始嘗試接觸其他回調(diào)方式吱晒,去感受這些回調(diào)方式的不同沦童。關(guān)鍵在于對于回調(diào)流程的理解叹话。你要知道你的回調(diào)是一個什么性質(zhì)的回調(diào),如果這個回調(diào)是一個不定期觸發(fā)氏豌,或者會多次觸發(fā)的热凹,那么 Delegation 應該更適合泵喘;如果這個回調(diào)是一個一次性的,并且和調(diào)用方法是單線性關(guān)系的相速,那么 Block 應該更適合鲜锚。在不同的執(zhí)行線(不是線程),不同的執(zhí)行次數(shù)芜繁、執(zhí)行數(shù)量上的區(qū)別,是鑒別使用哪一種回調(diào)的最好判斷方法蔬捷。
對于 Block 來說榔袋,他的執(zhí)行線應該是和調(diào)用方法、回調(diào)方法連續(xù)在一起的速妖;對于 Delegation 和 他的執(zhí)行線可以是連續(xù)的,也可以是調(diào)用方法和回調(diào)方法之間有很長的間隔罕容,或者說回調(diào)方法在執(zhí)行線上會多次出現(xiàn)稿饰。