最近对整个项目中的内存泄漏进行清查,发现一个及其隐蔽的内存泄漏,特此记录:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var categoryCell = tableView.dequeueReusableCell(withIdentifier: "GoodsCategoryCell") as? GoodsCategoryCell
if categoryCell == nil {
categoryCell = Bundle.main.loadNibNamed("GoodsCategoryCell", owner: nil, options: nil)?.first as! GoodsCategoryCell?
}
categoryCell?.nameLabel.text = dataSouce[indexPath.row].name
let data = self.dataSouce[indexPath.row]
categoryCell?.deleteCallBack = { [weak self] (button, event) in
guard let strongSelf = self else { return }
if strongSelf.deleteCallBack != nil {
strongSelf.deleteCallBack!(data) //通过block来捕获数据
}
tableView.reloadData() //循环引用
}
return categoryCell!
}
此处的循环引用发生在tableview和cell之间,一开始以为tableview是函数参数,即局部变量,所以没有多做处理。后来仔细分析发现确实是内存泄漏:
解决方案就很明显了:
categoryCell?.deleteCallBack = { [weak self] (button, event) in
guard let strongSelf = self else { return }
if strongSelf.deleteCallBack != nil {
strongSelf.deleteCallBack!(data) //通过block来捕获数据
}
strongSelf.tableView.reloadData() //打破循环引用环
}