如何找到所有闭包?

How can I find all closures?

提问人:Display Name 提问时间:2/28/2018 更新时间:2/28/2018 访问量:690

问:

我们完全忘记了在闭包中引用自我及其属性时捕获它。(注意:编译器没有警告我们。现在,我们的应用程序已满,具有很强的参考周期。为了修复它们,我们必须将捕获列表逐个添加到每个闭包中。

我们怎样才能找到它们?我想搜索,但它会导致太多的结果,包括评论,循环。in

好的旧目标 C 会帮助我搜索.它会警告我们......^

Swift Closures 捕获列表 强引用周期

评论

4赞 vadian 2/28/2018
没有明显的闭包语法,并非所有闭包都会导致保留周期(例如,GCD (a)sync DispatchQueue 闭包不会)
2赞 Andreas Oetjen 2/28/2018
你可以看看 github.com/yanagiba/swift-ast - 你可以创建抽象语法树并寻找 s。我还没有尝试过这个,但如果你发现了什么,你可以告诉我们是否有帮助:-)ClosureExpression
3赞 Rob 2/28/2018
顺便说一句,当你搜索 时,你是否告诉 Xcode 使用“匹配词”而不是“包含”。这样可以减少误报。或者,您可以执行正则表达式搜索,然后指定仅查找出现在行尾的那些匹配项:.这不会捕获内联闭包或完全缺少的闭包,但可能会找到一定比例的闭包。您可以根据需要更改该正则表达式,以针对您在项目中使用的模式类型进行定制。inin\bin\s*$in
2赞 Rob 2/28/2018
我知道您正在寻找一种查找闭包的方法,但显然另一种方法是运行应用程序并使用“调试内存图”功能来优化这些强引用周期。如果您使用“malloc stack”诊断设置,以便当您找到强参考周期时,您可以看到引入该周期的调用树。仍然需要进行一些侦查,但这是查找和诊断强参考周期的超级有效方法。
2赞 Rob 2/28/2018
非常好。顺便说一句,我不是建议使用 Instruments 分析应用程序。在 Xcode 中,有一个“调试内存图”功能(参见 stackoverflow.com/a/30993476/1271826 中答案的前半部分)。恕我直言,以这种方式找到强大的参考周期比使用 Instruments 进行分析要容易得多。

答: 暂无答案