回覆列表
-
1 # 使用者1180314636797
-
2 # 使用者7848980267795
區別在於:delegate()和.undelegate()方法實現的東西和.live()和.die()實現的東西是一樣的,他們只是用不同的語法實現而已。對於方法.live(),它容許你給所有當前以及將來會匹配的元素繫結一個事件處理函式(比如click事件),也能繫結自定義事件。 重寫:除了方法體裡面的程式碼,其他的部分都要和父類 中的一樣(訪問許可權要比父類中定義的訪問許可權寬鬆,如父類中定義為public,那子類重寫的方法也必須是public,不能是protected或者private)。 過載方法區別在於引數個數和引數型別,不在於返回值。也就是,過載方法的返回值可以不一樣,而重寫方法的返回值必須一樣。
block 和 delegate 都可以通知外面。block 更輕型,使用更簡單,能夠直接訪問上下文,這樣類中不需要儲存臨時資料,使用 block 的程式碼通常會在同一個地方,這樣讀程式碼也連貫。delegate 更重一些,需要實現介面,它的方法分離開來,很多時候需要儲存一些臨時資料,另外相關的程式碼會被分離到各處,沒有 block 好讀。應該優先使用 block。而有兩個情況可以考慮 delegate。1. 有多個相關方法。假如每個方法都設定一個 block, 這樣會更麻煩。而 delegate 讓多個方法分成一組,只需要設定一次,就可以多次回撥。當多於 3 個方法時就應該優先採用 delegate。比如一個網路類,假如只有成功和失敗兩種情況,每個方法可以設計成單獨 block。但假如存在多個方法,比如有成功、失敗、快取、https 驗證,網路進度等等,這種情況下,delegate 就要比 block 要好。在 swift 中,利用 enum, 多個方法也可以合併成一個 block 介面。swift 中的列舉根據情況不同,可以關聯不同資料型別。而在 objc 就不建議這樣做,objc 這種情況下,額外資料需要使用 NSObject 或者 字典進行強轉,介面就不夠安全。2. 為了避免迴圈引用,也可以使用 delegate。使用 block 時稍微不注意就形成迴圈引用,導致物件釋放不了。這種迴圈引用,一旦出現就比較難檢查出來。而 delegate 的方法是分離開的,並不會引用上下文,因此會更安全些。假如寫一個庫供他人使用,不清楚使用者的水平如何。這時為防止誤用,寧願麻煩一些,笨一些,使用 delegate 來替代 block。將 block 簡單分類,有三種情形。* 臨時性的,只用在棧當中,不會儲存起來。比如陣列的 foreach 遍歷,這個遍歷用到的 block 是臨時的,不會儲存起來。* 需要儲存起來,但只會呼叫一次,或者有一個完成時期。比如一個 UIView 的動畫,動畫完成之後,需要使用 block 通知外面,一旦呼叫 block 之後,這個 block 就可以刪掉。* 需要儲存起來,可能會呼叫多次。比如按鈕的點選事件,假如採用 block 實現,這種 block 就需要長期儲存,並且會呼叫多次。呼叫之後,block 也不可以刪除,可能還有下一次按鈕的點選。對於臨時性的,只在棧中使用的 block, 沒有迴圈引用問題,block 會自動釋放。而只調用一次的 block,需要看內部的實現,正確的實現應該是 block 呼叫之後,馬上賦值為空,這樣 block 也會釋放,同樣不會迴圈引用。而多次呼叫時,block 需要長期儲存,就很容易出現迴圈引用問題。Cocoa 中的 API 設計也是這樣的,臨時性的,只會呼叫一次的,採用 block。而多次呼叫的,並不會使用 block。比如按鈕事件,就使用 target-action。有些庫將按鈕事件從 target-action 封裝成 block 介面, 反而容易出問題。