设置实例属性时,是否在 URLSession dataTask 中使用 [weak self]?
Do i use [weak self] in URLSession dataTask when setting instance properties?
我不确定我是否应该在这里使用 [weak self]
,如果我不这样做,我在设置结构数组时是否有内存问题?
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
self.showErrorAlertMessage(message: error.localizedDescription, title: "Some error")
return
}
guard let data = data else { return }
guard let httpResponse = response as? HTTPURLResponse else { return }
if (httpResponse.statusCode == 200) {
do {
let decodedResponse = try JSONDecoder().decode(CodableStruct.self, from: data)
self.structArray = decodedResponse.results
} catch {
self.showErrorAlertMessage(message: error.localizedDescription, title: "Some error")
print("Error:\(error)")
}
} else {
self.showErrorAlertMessage(message: "Some error", title: "error")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}.resume()
}
是的,最好在这里使用 [weak self]
。
如果您不使用,该块将持有对 self
的强引用,直到它被调用,因此它可能会延迟 self
的释放,但不会导致memory leak
因为 self
没有强烈引用这个 dataTask
。
我不确定我是否应该在这里使用 [weak self]
,如果我不这样做,我在设置结构数组时是否有内存问题?
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
self.showErrorAlertMessage(message: error.localizedDescription, title: "Some error")
return
}
guard let data = data else { return }
guard let httpResponse = response as? HTTPURLResponse else { return }
if (httpResponse.statusCode == 200) {
do {
let decodedResponse = try JSONDecoder().decode(CodableStruct.self, from: data)
self.structArray = decodedResponse.results
} catch {
self.showErrorAlertMessage(message: error.localizedDescription, title: "Some error")
print("Error:\(error)")
}
} else {
self.showErrorAlertMessage(message: "Some error", title: "error")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}.resume()
}
是的,最好在这里使用 [weak self]
。
如果您不使用,该块将持有对 self
的强引用,直到它被调用,因此它可能会延迟 self
的释放,但不会导致memory leak
因为 self
没有强烈引用这个 dataTask
。