【问题标题】:Deleting CAMetalLayer for NSView为 NSView 删除 CAMetalLayer
【发布时间】:2018-11-27 14:53:19
【问题描述】:

我有一个自定义的NSView 类,它是层支持的。我为这个在makeBackingLayer 中创建的NSView 创建了一个CAMetalLayer

makeBackingLayer 我创建一个层CAMetalLayer *backingLayer = [CAMetalLayer layer]; 并根据我的需要设置属性。

我的问题是,我需要在销毁NSView 时明确地dealloc 这个层吗? 我没有在重写的函数中创建这个层,我有责任删除它还是 NSView 会处理它?

我没有看到任何与此相关的文档。此外,我看到的所有示例都没有提到在任何地方删除图层。

谢谢

【问题讨论】:

    标签: calayer nsview metal


    【解决方案1】:

    您可能不需要手动释放图层。假设您的程序启用了 ARC(自动引用计数),您的 NSView 应该在销毁时自动释放设置为 .layer 属性的 CALayer

    如果您不确定 ARC 是否已启用,您可以转到 Xcode 项目中的构建设置并搜索自动引用计数。几年来,新的 Xcode 项目默认启用它。

    注意:您的NSView 只有在它是唯一持有对它的引用的对象时才能释放您的层。如果您的程序中的其他对象持有对您的CAMetalLayer 的引用,您的层将不会被释放,直到它们删除它们的引用。

    【讨论】:

    • 即使项目没有使用 ARC,[CAMetalLayer layer] 也会返回 +0 引用,-makeBackingLayer 应该返回 +0 引用(非常匹配)。因此,如果框架需要/希望该层继续存在,他们负责保留和释放它。 OP 只负责匹配他们对(自动)发布所做的任何显式保留,或者,如果使用强属性,则根据所有强属性的要求释放 -dealloc 中的引用。没有特定于图层情况的内容。
    • @KenThomases 我如何检查[CAMetalLayer layer] 是否返回+0 引用?我似乎在文档中找不到这样的东西。有没有地方在这样的细节中记录了这一点?
    • @user007 在 Cocoa 中,内存管理基于method-naming conventions。如果方法的名称以“alloc”、“new”、“copy”或“mutableCopy”开头,则返回 +1 引用;否则,它返回 +0。
    • @KenThomases 非常感谢!
    • @user007 顺便说一句,如果您希望通过实验证明这种行为,您可以将弱指针 (using__weak) 指向您的层,并在调试器中确认该对象在视图被释放。或者,您可以覆盖 dealloc 并记录它以确认它被调用(假设您的 CAMetalLayer 是子类)。
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多