最近、私が書いたオブジェクトが単体テストを使って適切に割り当て解除されたことを確認しようとしていました。私は、テストが完了する前に、オブジェクトを試しても、割り当てを解除していなかったことに気がつきました。そこで私は、弱い変数を使ってオブジェクトの割り振りの基礎を証明しようとする簡単な例(下記参照)にテストを縮小しました。Swift XCTest:弱い変数の適切な割り当て解除を確認する
私の考えでは、強力なリファレンスはテストメソッドが終了した後にオブジェクトを保持しなくてはならず、弱いリファレンスは次の実行ループで参照されるときは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
のテストメソッド本体をラッピングすると、オブジェクトが割り当て解除されることはありませんでした。
'例えば、オプションにする必要がありweakMock'弱い弱い弱いモック:モック? = strongMock'。 'nil'に設定できない場合は解放できません。 – par
@par 'weakMock'は自動的にオプションで、コンパイラによって強制されます。 'weakMock'の型を調べると、明示的な型の注釈なしで' Mock? 'になっています。 –
明示的にオプションにすると、それはゼロになりますか? – par