-
闭包被引用,需要逃逸。
循环引用
方法一:[weak self] (推荐)
self 是可选项,如果 self 已经被释放,则为 nil
// 类似 OC 中:__weak typeof(self) weakSelf;
// 如果 self 已经被释放,则为 nil
loadData { [weak self] in
print("\(self?.view)")
}
方法二: [unowned self] (不推荐)
self 不是可选项,如果 self 已经被释放,则出现野指针访问
// 类似 OC 中:__unsafe_unretained typeof(self) weakSelf;
// 如果 self 已经被释放,则出现野指针访问
loadData { [unowned self] in
print("\(self.view)")
}
方法三:与 OC 类似
weak var weakSelf = self
loadData() {
print("\(weakSelf?.view)")
}
网络请求试写
func request(urlStr: String, compeletd:@escaping (Bool, Any) -> Void) {
guard let url = URL(string: urlStr) else {
return
}
DispatchQueue.global().async {
URLSession.shared.dataTask(with: url) { (data, _, error) in
if error != nil {
DispatchQueue.main.async {
compeletd(false, error!)
}
} else {
let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
DispatchQueue.main.async {
compeletd(true, json!)
}
}
}.resume()
}
}

评论列表