DispatchGroup导致的控制器不能释放问题

325 阅读1分钟
问题描述:

控制器的deinit被推迟执行,导致监听横竖屏的通知没有隐藏,引起masonry中的约束找不到self.view崩溃。

找到问题
let group = DispatchGroup()

group.enter()

request{
    group.leave()
}
.
.
.

group.notify{
    
}

由于在请求中加了几个print,发现进入控制器后进行的一系列请求,在控制器dismiss之后还在回调,猜测是这里持有self,导致的释放延迟问题。

经过测试,果然这里的问题。

解决方案
group.notify{ [weak self] in
    guard let self = self else {
        return
    }
}
得到结论

很多闭包虽然不会引起循环引用,但依然会导致实例延迟释放。