swift中閉包 OC中Block 解決循環引用


OC 中 全局宏定義

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;

用法如下:

WS(weakself)

[self.tableView addHeaderWithCallback:^{

[weakself requestMemberList];

}];

 

 

swift 在比閉包 中使用 weakSelf

weak var weakSelf = self
demo4 {
    // 使用?的好處 就是一旦 self 被釋放,就什么也不做
    weakSelf?.view.backgroundColor = UIColor.redColor()
}

 

這才是高級方法:

swift 中一個類可以嵌套定義另外類,新增加的類只能被當前類使用

在 swift 中,要解除閉包的 循環引用,可以在閉包定義中使用 [unowned self] 或者 [weak self],其中:

[unowned self] 類似與 OC 中的 unsafe_unretained,如果對象被釋放,仍然保留一個 無效引用,不是可選項

 [weak self] 類似與 OC 中的 __weak,如果對象被釋放,自動指向 nil,更安全

[weak self] 時時監控性能較差,[unowned self]可能導致野指針錯誤,如果能夠確定對象不會被釋放,盡量使用 unowned

 

例子   懶加載的閉包

lazy var printName: ()->() = { [unowned self] in

        print(self.name)

   }

 

 // 下面這句不會發生發生循環引用因為執行完就會消失

 lazy var title: String = {

        print(self.name)

        

        return "Mr. \(self.name)"

    }()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM