我对 Swift 比较陌生,所以我希望我没有问一个愚蠢的问题。
我有一些实例化类型数组的代码Error
,稍后将被迭代并打印到控制台。当使用“Leaks”工具通过 Instruments 运行此代码时,它显示了泄漏_SwiftNativeNSError
。如果我更改数组类型[Error]
to [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]()
to [Any]()
解决了泄漏,但在不了解根本问题的情况下,我对此作为解决方案并不满意。问题也通过改变解决了[Error]()
到我的枚举实现Error
协议:[err]()
。我还尝试创建自己的自定义协议只是为了证明这是否是专门由Error
,并且我只能在使用时重现问题Error
;我自己的自定义协议没有表现出这种行为。
最初,我的代码使用了forEach
循环来迭代数组,但然后我尝试重写它以使用标准for
循环以防闭包forEach
导致了这个问题,但这不起作用。
我怀疑这可能是一个 Swift 错误(在这种情况下,我会为其打开一个问题),但也有可能我错过了一个关键的理解。如果我所做的事情是不好的做法,我想了解为什么。
Update:
在与 Apple 工程师 Joe Groff 交谈后,您可能遇到了以下错误:https://bugs.swift.org/browse/SR-6536 https://bugs.swift.org/browse/SR-6536
原答案
我玩了一下你的代码,我认为问题是由于Error
类型。
事实上,如果你使用 Josh 的代码,你会发现不同的行为Error
or MyError
作为数组的类型。
我想问题是从deinit
呼叫未转接至CustomObject
since Error
只是一个协议,它不知道底层类。尽管,MyError
是。我们可以等待其他人对这种行为做出澄清。
为了简单起见,我在这里使用 Playground。请注意,我什至没有尝试打印错误值。
import UIKit
class ViewController: UIViewController {
var errors: [Error] = [] // change to MyError to see it working
enum MyError: Error {
case test (CustomObject)
}
class CustomObject {
deinit {
print("deiniting")
}
}
override func viewDidLoad() {
super.viewDidLoad()
let testerror = MyError.test(CustomObject())
errors.append(testerror)
errors.removeAll()
}
}
do {
let viewController = ViewController()
// just for test purposes ;)
viewController.viewDidLoad()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)