swift 關於delegate,swiftdelegate

來源:互聯網
上載者:User

swift 關於delegate,swiftdelegate

Cocoa 開發中介面-委託 (protocol-delegate) 模式是一種常用的設計模式,它貫穿於整個 Cocoa 架構中,為代碼之間的關係清理和解耦合做出了不可磨滅的貢獻。

在 ARC 中,對於一般的 delegate,我們會在聲明中將其指定為 weak,在這個 delegate 實際的對象被釋放的時候,會被重設回 nil。這可以保證即使 delegate 已經不存在時,我們也不會由於訪問到已被回收的記憶體而導致崩潰。ARC 的這個特性杜絕了 Cocoa 開發中一種非常常見的崩潰錯誤,說是救萬千程式員於水火之中也毫不為過。

在 Swift 中我們當然也會希望這麼做。但是當我們嘗試書寫這樣的代碼的時候,編譯器不會讓我們通過:

這是因為 Swift 的 protocol 是可以被除了 class 以外的其他類型遵守的,而對於像 struct 或是enum 這樣的類型,本身就不通過引用計數來管理記憶體,所以也不可能用 weak 這樣的 ARC 的概念來進行修飾。

 

想要在 Swift 中使用 weak delegate,我們就需要將 protocol 限制在 class 內。一種做法是將 protocol 聲明為 Objective-C 的,這可以通過在 protocol 前面加上 @objc 關鍵字來達到,Objective-C 的 protocol 都只有類能實現,因此使用 weak 來修飾就合理了:

 

另一種可能更好的辦法是在 protocol 聲明的名字後面加上 class,這可以為編譯器顯式地指明這個 protocol 只能由 class 來實現:

 

 

相比起添加 @objc,後一種方法更能表現出問題的實質,同時也避免了過多的不必要的 Objective-C 相容,可以說是一種更好的解決方式。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.