通常而言,iOS系统中的大部分block都不需要防循环引用。在最近的工作中,遇到了一个需要防循环引用的地方(也就是需要用到weakSelf/strongSelf的组合)那就是UITableViewRowAction。
UITableViewRowAction
该控件是tableView上的左滑按钮,通常在tableViewDelegate中的方法
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
这个方法上进行配置。
而UITableViewRowAction的初始化方法需要传入一个block,以执行点击按钮后的回调。在这个block中不能强引用self,否则会造成循环引用。
实验验证
验证代码如下
class SecondViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
var tableView:UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.tableView = UITableView(frame: self.view.bounds)
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.separatorColor = UIColor.gray
self.tableView.tableFooterView = UIView()
self.view.addSubview(self.tableView)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return UITableViewCell()
}
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let action = UITableViewRowAction(style: .normal, title: "delete") {(action, indexpath) in
print(self.tableView.count)
}
return [action]
}
deinit {
print("SecondViewController is deinit")
}
}
代码中的SecondViewController由FirstViewController通过导航控制器push进来。在不对TableView进行左滑操作时,SecondViewController可以被正常释放掉,而在左滑操作后点击左滑的按钮时,SecondViewController也可以被正常释放。但是,在进行左滑操作后不点击按钮而直接返回FirstViewController,则SecondViewController不会被释放掉。为了防治内存泄漏,不能让其block强引用self。
网友评论