Недавно я пытался проверить, что объект, который я написал, правильно освобождает, используя модульный тест. Однако я обнаружил, что независимо от того, что я пробовал, объект не будет освобожден до завершения теста. Поэтому я уменьшил тест до тривиального примера (см. Ниже), который пытается доказать основы снятия объекта с использованием слабых переменных.Swift XCTest: проверить правильное освобождение слабых переменных
На мой взгляд, сильная ссылка должна прекратить удерживать объект после завершения метода тестирования, а слабая ссылка должна быть равна нулю при ссылке на следующий цикл цикла. Тем не менее, слабая ссылка никогда не равна нулю, и оба теста терпят неудачу. Я что-то не понимаю? Ниже приведены единичные тесты в полном объеме.
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' должен быть необязательным, например, 'слабый var weakMock: Mock? = strongMock'. Если он не может быть установлен в 'nil', он не может быть выпущен. – par
@par 'weakMock' автоматически опционально, который выполняется компилятором. Если вы проверите тип 'weakMock', это уже' Mock? 'Без явной аннотации типа. –
И если вы сделаете это явно необязательным, станет ли оно нулевым? – par