我注意到,当我删除对MTKView子类实例的所有引用,或者从不创建任何实例时,实例仍然会持续很长时间并继续绘制。这可以通过调用下面的makeLeak
方法来证明。
来源:
class MTKViewSubclass: MTKView {
override func draw(_ rect: CGRect) {
print("MTKViewSubclass draw")
}
}
func makeLeak() {
// Make an MTKViewSubclass without storing a reference to it.
let _ = MTKViewSubclass(frame: CGRect(x: 0, y: 0, width: 100, height: 100), device: nil)
}
输出:
MTKViewSubclass draw
MTKViewSubclass draw
MTKViewSubclass draw
...
鉴于继续调用draw方法,MTKView的显示链接使其保持活动是有道理的。调试导航器中的Xcode的内存图层次结构似乎证实了这一点,尽管我不是读它的专家。
令我惊讶的是,即使MTKView不在视图层次结构中,它也会绘制。无论如何,我怎样才能确保它被清理干净?我有一个带有MTKView的视图控制器,可以实例化并多次释放。
修改:有趣的是,虽然暂停MTKView与isPaused
似乎删除了其显示链接引用,但视图仍然存在。存储器图层次结构显示了MTKView的CAMetalLayer对视图本身的引用,以及其他参考。我不知道哪些参考文献很强。