【发布时间】:2017-04-20 03:55:41
【问题描述】:
考虑以下简化的结构:
class MyClass {
weak var delegate: MyClassDelegate?
}
protocol MyClassDelegate: class {
func goneWrong()
}
以及抛出 EXC_BAD_ACCESS (0x40dedeadbec0) 错误的测试用例:
class MyTest: XCTestCase {
func test() {
let exp = expectation(description: "Expecting a call")
let a = MyClass()
a.delegate = MyMockDelegate(exp: exp)
// Thread 1: EXC_BAD_ACCESS(code=1, address=0x40dedeadbec0)
waitForExpectations(timeout: 10)
}
class MyMockDelegate: MyClassDelegate {
let exp: XCTestExpectation
init(exp: XCTestExpectation) {
self.exp = exp
}
func goneWrong() {
self.exp.fulfill()
}
}
}
如果委托 var 声明正常,没有弱关键字,则不会抛出错误。问题是它需要弱才能避免真实代码(而不是测试用例)中的强引用循环。我该如何解决这个问题?
【问题讨论】:
-
只需将您的委托模拟保存在一个常量中,以在当前词法范围内保持强引用:
let delegate = MyMockDelegate(exp: exp) -
我注意到在 Xcode Playgrounds 中,当代理声明为弱时,这也往往会发生。
-
@werediver 我试过了,我也试过将它存储为测试类的属性,但我得到了同样的错误。
-
无法从示例中重现。
标签: swift automatic-ref-counting xctest weak-references