保持サイクルをチェックするテストを作成しようとしていますが、この奇妙な動作に遭遇しました。ビューコントローラをnil
に設定すると、UIViewController
のプロパティは割り当て解除されません。このモックオブジェクトを例に取ってみましょう:割り当て解除後にUIViewController変数が残る
class BasicViewController: UIViewController {
var someObject = NSObject()
.....
}
これはすべて変数です。 basicViewController = nil
を呼び出すと、someObject
がnilになることが想定されますが、そうでないと仮定します。 viewDidLoad
、viewDidAppear
とviewWillAppear
-
it("releases someObject") {
var controller: MockController? = MockController()
weak var something = controller?.something
expect(controller).toNot(beNil())
controller = nil
expect(controller).to(beNil())
expect(something).to(beNil())
}
it("doesn't release someObject") {
var controller: MockController? = MockController()
weak var something = controller?.something
expect(controller).toNot(beNil())
_ = controller?.view
controller = nil
expect(controller).to(beNil())
expect(something).toNot(beNil())
}
vc.view
を呼び出すとき、これはloadView
などUIViewController
のライフサイクル関数を呼び出します。私の質問はなぜですか?なぜUIViewController
のview
プロパティを参照すると、UIViewController
をnil
に設定した後でも、UIViewController
が所有するすべてのオブジェクトが保持されるのはなぜですか。オブジェクトは、プールから排出されたときに正確に決まりますautoreleasepool
を、追加
、そしてそれは同様に動作します:
FWIW、私はQuick
とテストのためNimble
だけでなく、Swift 3.1
しかし、2つのテストを見ると、2つのテストの唯一の違いは、私が_ = vc.viewを呼び出すことです。テストをパスするためにtoNot()を使用する必要があります。それは望ましくない。私はこの例を作成して、最も単純なオブジェクトでさえ、この永続性がどのように発生するかを示しました。何か強いリファレンスサイクルは起こっていません。何かは単なるNSObjectです。ビューとやりとりするとき、コントローラのプロパティは持続しますが、しばらくすると割り当てが解除されると私は信じています。 – jsetting32