2017-03-04 4 views
0

Ich habe eine UIView, die zu einem UIViewController hinzugefügt wird, und teste generell die Deinitialisierung, um sicherzustellen, dass ich die Dinge richtig mache. Aber wenn ich die Variable in meinem viewController nicht auf nil setze und nur .removeFromSuperView() verwende, wird die deinit() -Methode in UIView erst aufgerufen, wenn ich die UIView zu einem anderen Zeitpunkt als ihrem aufgerufenen Objekt hinzufüge. Aber wenn ich removeFromSuperView() verwende und die Variable auf nil setze, wird deinit() sofort aufgerufen. Warum das?Warum wird Deinit erst aufgerufen, wenn UIView wieder zum übergeordneten Objekt hinzugefügt wird?

Hier UIView() Klasse:

class TestView: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) 
     print("init is happneing") 
    } 

    deinit { 
     print("de init is happneing") 
    } 


    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Hier ist der Mutterviewcontroller:

class MyViewController: UIViewController { 
var tstview : TestView? 


    //adding the UIView by tapping on a button 
@IBAction func addView(_ sender: UIButton) { 

     let test = TestView() 
     tstview = test 
     tstview?.frame = CGRect(x: 50, y: 60, width: self.view.frame.width-100, height: self.view.frame.height-200) 
     tstview?.backgroundColor = UIColor.white 
     self.view.addSubview(tstview!) 
} 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    //removing UIView by touching elsewhere 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     tstview?.removeFromSuperview() 
     // tstview = nil 

    } 


} 

Antwort

0

deinit aufgerufen wird, wenn niemand das Objekt verweist. Wenn Sie tstview nicht auf nil setzen, verweist Ihr MyViewController immer noch darauf, daher wird deinit nicht aufgerufen. Wenn Sie addView aufrufen, entfernt die Anweisung tstview = test schließlich den letzten Verweis auf die alte Ansicht und löst so den Deinitializer aus.

Sie können mehr über das Konzept der Deinitialisierung in der Swift documentation lesen.


Wenn Sie so schnell benachrichtigt werden möchten, wie die Ansicht abgenommen wird, override willMove(toSuperview:) statt.

+0

Vielen Dank für die Antwort, ich möchte sicherstellen, dass ich kein Leck, das in diesem Fall, wie ich verstehe, wirdMove toSuperview wird nicht helfen. Ich versuche zu verstehen, warum removeFromSuperview() nicht deininiert, bis ich eine andere Instanz der UIView() zu meinem übergeordneten Controller hinzufügen, denn dann und nur dann sehe ich deninit aufgerufen wird. Ich habe mir die Dokumente angeschaut, kann aber den Grund nicht finden. – TheeBen

+0

@TheeBen Bitte überprüfen Sie den aktualisierten ersten Absatz. – kennytm

+0

Schön! jetzt habe ich es verstanden! Ich werde so schnell wie möglich akzeptieren – TheeBen

Verwandte Themen