我遇到了最奇怪的事情,也许有人能解释.
- 创建UIA视图
- 创建对
- 向视图层次 struct 中添加
- 从视图层次 struct 中删除
- 将A设为零
- 弱引用仍然存在.
如果跳过第3步和第4步,弱引用将如预期的那样变为零.
Code to test:
TestView to check deinit
class TestView: UIView {
deinit {
print("deinit")
}
}
单元测试
class RetainTests: XCTestCase {
func testRetainFails() {
let holderView = UIView()
var element: TestView? = TestView()
holderView.addSubview(element!)
element?.removeFromSuperview()
weak var weakElement = element
XCTAssertNotNil(weakElement)
// after next line `weakElement` should be nil
element = nil
// console will print "deinit"
XCTAssertNil(weakElement) // fails!
}
func testRetainPasses() {
var element: TestView? = TestView()
weak var weakElement = element
XCTAssertNotNil(weakElement)
// after next line `weakElement` should be nil
element = nil
// console will print "deinit"
XCTAssertNil(weakElement)
}
}
这两个测试都会在控制台上打印出deinit
,但是如果测试失败,如果element
在任何时候都在视图层次 struct 中,weakElement
仍然保留引用,尽管element
成功地解除了分配.怎么会这样?
(编辑:这是在应用程序中,而不是在playground 中)