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)"
}()