使用@noescape解決Swift閉包“保留環”問題

來源:互聯網
上載者:User

標籤:swift   保留環   noescape   

在使用Swift進行編程的時候我們經常使用閉包,閉包雖然好,但是不可避免地會帶來“保留環”問題,考慮下面的情況:
在某個動畫架構中有一個loop函數:

 func loop(duration:NSTimeInterval,reverse:Bool,animations:()->Bool )

在我們自己的類中定義一個動畫方法,使用了這個函數:

class MyView:UIView{    func animations(){        loop(duration:0.5,reverse:true){        self.scale(1.25)        }    }    func scale(scale:Double){...}}

你會發現在閉包中捕獲了self,loop函數迴圈每次都調用閉包,這樣會一直保留self。而閉包中的操作其實是一成不變的,沒有必要每次都訪問。如果我們只調用一次animations閉包,給它拍一張快照就可以解決這個問題了,這就要用到@noescape:

func loop(duration:NSTimeInterval,reverse:Bool,@ noescape animations:()->Bool )

這樣就不會有保留環問題,因為這個閉包只被執行一次,即便發生迴圈時也會繞過閉包。@noescape還是個新角色,但是系統庫中已經有些地方在使用了,比如我們熟悉的reduce方法:

func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

使用@noescape解決Swift閉包“保留環”問題

相關文章

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.