gpt4 book ai didi

swift XCTest : Verify proper deallocation of weak variables

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:01 27 4
gpt4 key购买 nike

最近我试图使用单元测试验证我编写的对象是否正确解除分配。然而,我发现无论我尝试什么,对象都不会在测试完成之前解除分配。因此,我将测试简化为一个简单的示例(见下文),它试图证明使用弱变量进行对象释放的基础知识。

在我看来,强引用应该在测试方法退出后停止保留对象,而弱引用应该在下一个运行循环引用时为nil。但是,弱引用永远不会为 nil,并且两个测试都失败了。我在这里误解了什么吗?以下是完整的单元测试。

class Mock { //class type, should behave with reference semantics

init() { }
}

class DeallocationTests: XCTestCase {

func testWeakVarDeallocation() {

let strongMock = Mock()

weak var weakMock: Mock? = strongMock

let expt = expectation(description: "deallocated")

DispatchQueue.main.async {

XCTAssertNil(weakMock) //This assertion fails

expt.fulfill()
}

waitForExpectations(timeout: 1.0, handler: nil)
}

func testCaptureListDeallocation() {

let strongMock = Mock()

let expt = expectation(description: "deallocated")

DispatchQueue.main.async { [weak weakMock = strongMock] in

XCTAssertNil(weakMock) //This assertion also fails

expt.fulfill()
}

waitForExpectations(timeout: 1.0, handler: nil)
}
}

我认为 XCTest 可能以某种方式推迟了释放,但即使将测试方法主体包装在 autoreleasepool 中也不会导致对象释放。

最佳答案

问题是当调用 dispatchAsync block 时,您的 testWeakVarDeallocation() 函数还没有退出,所以对 strongMock 的强引用是仍然持有。

像这样尝试(允许 testWeakVarDeallocation() 退出),你会看到 weakMock 变成了预期的 nil:

class weakTestTests: XCTestCase {
var strongMock: Mock? = Mock()

func testWeakVarDeallocation() {
weak var weakMock = strongMock

print("weakMock is \(weakMock)")

let expt = self.expectation(description: "deallocated")

strongMock = nil

print("weakMock is now \(weakMock)")

DispatchQueue.main.async {
XCTAssertNil(weakMock) // This assertion fails

print("fulfilling expectation")
expt.fulfill()
}

print("waiting for expectation")
self.waitForExpectations(timeout: 1.0, handler: nil)
print("expectation fulfilled")
}
}

关于 swift XCTest : Verify proper deallocation of weak variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41308381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com