【发布时间】:2017-12-20 11:00:19
【问题描述】:
我对 Swift 比较陌生,所以我希望我不是在问一个愚蠢的问题。
我有一些代码实例化了一个Error 类型的数组,稍后将对其进行迭代并打印到控制台。当使用“Leaks”工具通过 Instruments 运行此代码时,它显示_SwiftNativeNSError 的泄漏。如果我将数组类型从[Error] 更改为[Any],泄漏就会消失,即使它实际上仍然持有符合Error 的对象。我尝试过的任何其他数据类型或协议都无法重现泄漏。
这里有一些示例代码:
class myLeak {
lazy var errors = [Error]()
enum err: Error {
case myFirstError
}
func doSomething() {
errors.append(err.myFirstError)
for error in errors {
print(String(describing: error))
}
}
}
// call with let myleak = myLeak(); myleak.doSomething()
调用 doSomething() 函数会立即产生泄漏。将[Error]() 切换为[Any]() 可以解决泄漏问题,但如果不了解潜在问题,我对此并不满意。通过将[Error]() 更改为实现Error 协议的我的枚举也解决了该问题:[err]()。我还尝试创建自己的自定义协议,以证明这是否是由Error 专门引起的,并且我只能在使用Error 时重现该问题;我自己的自定义协议没有表现出这种行为。
最初,我的代码使用forEach 循环来迭代数组,但后来我尝试重写它以使用标准for 循环,以防forEach 中的闭包导致问题,但这并没有不行。
我怀疑这可能是一个 Swift 错误(在这种情况下,我会为它打开一个问题),但我也有可能错过了一个关键的理解。如果我的做法是不好的做法,我想了解原因。
【问题讨论】:
-
复制您的代码并将 deinit 添加到
myLeak类以检查 deist 是否被调用。显然它被调用了,所以我没有看到任何泄漏,因为myLeak -
我已经添加了一个解释。我猜这个问题是由于
Error. -
我添加了一个更新。
-
@LorenzoB 谢谢 - 我确实发现记录了该错误,但尽管它似乎相关,但这似乎是一个稍微不同的情况,因为这与可选错误有关。我同意它看起来确实相关,并且我在我提交的雷达中引用了那个错误。非常感谢您的跟进。
标签: ios arrays swift memory-leaks