類似于OC的block,swift閉包中也存在循環引用的問題,通常解決閉包中循環引用的方式有以下三種
(1)方式一:weak修飾
weak var weakSelf : ViewController? = self
// 閉包中如果使用當前對象的屬性或者調用方法,必須使用self
httpTool?.loadData({ (data) -> () in
weakSelf?.view.backgroundColor = UIColor.redColor()
})
(2)方式二:[weak self]修飾
// 常用方式
httpTool?.loadData({[weak self] (data) -> () in
self?.view.backgroundColor = UIColor.redColor()
})
(3)方式三:[unowned self]修飾
httpTool?.loadData({[unowned self] (data) -> () in
self.view.backgroundColor = UIColor.redColor()
})
weak和unsafe_unretain的區別:
weak在相關對象銷毀時會自動清空,指向nil,不會導致野指針錯誤;
unsafe_unretain在相關對象銷毀時不會指向nil,仍保留之前的內存地址,當相應的指向中換成其它對象時,就會出現野指針錯誤。