如何在Swift中检测和调试强引用周期?

Alf*_*a07 3 profiling memory-profiling swift

在简单的情况下,它只是对几行代码的强烈盯着是微不足道的:

class A {
    var b: B?
}

class B {
  var a: A?
}

var a = A()
var b = B()
a.b = b
b.a = a
Run Code Online (Sandbox Code Playgroud)

如何解决> 50k行代码项目的这个问题(从Objective-C/C++移植).例如,有没有办法开发一个工具来在运行时遍历对象图(就像在Java/C#世界中那样)?

Gae*_*ael 6

您可以使用仪器检测强引用周期,而不是实现对象图遍历:它可以识别内存泄漏并以图形方式显示周期(Apple仪器文档)

您应该用Swift中的弱实例变量替换每个目标C弱属性

    class B {
      weak var a: A?
    }
Run Code Online (Sandbox Code Playgroud)

如果你可以确定它永远不会将nil作为一个值,你可以将它作为无主的前缀

    class B {
      unowned var a: A
    }
Run Code Online (Sandbox Code Playgroud)

然后你可以访问该属性,而不必强制解包变量!

如果你的Objective-C代码使用在arc之前是常量的@properties属性,那么可能还有更多内容