宽容他人,放过自己。

swift闭包与OC中Block循环引用[weak self]

Posted on By anchoriteFili

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

直接添加[weak self]

HYHttpTool.post(url: urlString, param: ["appid":WXAPPID,"secret":WXSECRET,"code":code,"grant_type":"authorization_code",]) { [weak self] (response, result) in
  self?.
}

class func post(url: String?, param: Parameters, complete: @escaping (HTTPURLResponse?, Result<Any>) -> Void ) -> Void {
        
  // 如果发过来的链接长度为空,则直接返回,不做任何反应
  guard let urlString = url, strlen(url) > 0 else {
    return
  }
        
  Alamofire.request(urlString, method: .post, parameters: param).responseJSON { (response) in
    complete(response.response, response.result)
  }
}

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