最近、単体テストを使用して、作成したオブジェクトが適切に割り当て解除されることを確認しようとしていました。ただし、何を試しても、テストが完了する前にオブジェクトの割り当てが解除されないことがわかりました。そこで、弱い変数を使用してオブジェクトの割り当て解除の基本を証明しようとする単純な例 (以下を参照) にテストを縮小しました。
私の考えでは、テストメソッドが終了した後、強参照はオブジェクトの保持を停止する必要があり、弱参照は次の実行ループで参照されるときに 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
、オブジェクトの割り当て解除は発生しませんでした。