Je fais face à un problème de désallocation et peut-être à un référencement fort ou circulaire qui ne peut pas être compris. J'ai trois UIView
de l'instanciation comme ci-dessous:Références fortes et problèmes de mémoire UIView
Il y a une principale ViewController
que j'ai ajouté un UIView
intérieur en story-board et le UIView
a une sortie weak
intérieur de la classe comme:
class ViewController : UIViewController {
//MARK: - outlets
@IBOutlet weak var firstView: FirstUiview!
}
seconde UIView
est ajouté en tant que sous-vue à la première vue comme programme:
class FirstUiview : UIView {
//creating an instance of secondUiView
lazy var mySecondView: SecondViewClass = {
let dv = SecondViewClass()
dv.backgroundColor = UIColor.red
return dv
}()
//sometime later by clicking on a button
self.addSubview(mySecondView)
//a button will be tapped to remove mySecondView;
//later will be called at some point upon tapping:
func removingSecondViewByTapping() {
if mySecondView.isDescendant(of: self) {
mySecondView.removeFromSuperview()
}
}
}
maintenant, le SecondViewClass
est:
class SecondViewClass : UIView {
//in this class I create bunch of uiview objects like below:
lazy var aView : UIView = {
let hl = UIView()
hl.tag = 0
hl.backgroundColor = UIColor.lightGray
return hl
}()
self.addSubview(aView) //... this goes on and I add other similar views the same way.
//creating an instance of thirdView
var let thirdView = UIView()
self.addSubview(thirdView)
}
Maintenant, si l'utilisateur appuie sur le bouton pour supprimer mySecondView
puis l'ajouter à nouveau à un autre moment (toujours dans le même ViewController
) J'attends tous les sous-vues de mySecondView
auraient été libérés et ont disparu, mais ils sont tous là. J'apprécierais beaucoup si quelqu'un peut me le signaler où est-ce que je garde une référence forte ou s'il y a un problème de référence circulaire? ou peut-être autre chose?
Pourquoi voudriez-vous attendre à des sous-vues de la 2ème vue à être parti? Supprimer mySecondView de sa vue d'ensemble ne lui fait pas supprimer toutes ses sous-vues. – dan
@dan Oh, attendez, je pensais que view.removeFromSuperview va libérer et détruire la vue, y compris ses sous-vues à moins que ses sous-vues aient des références à quelque chose qui est tenu, n'est-ce pas? si non, ne pourriez-vous pas me guider sur la façon dont je peux totalement supprimer la vue d'envoi, y compris ses sous-vues? – TheeBen