为什么MTKView在未被引用的情况下仍然存在?我该如何清理?

时间:2017-03-07 04:40:50

标签: ios swift xcode metal

我注意到,当我删除对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对视图本身的引用,以及其他参考。我不知道哪些参考文献很强。

0 个答案:

没有答案