Miks peaksime IBOutlet'id vabastama meetodis viewDidUnload?
sobes.tech AI
Vastus AI-lt
viewDidUnload tiek izsaukts pēc tam, kad skata kontrolieris tiek izkrauts no atmiņas, parasti resursu trūkuma dēļ. Šajā metodē mēs atbrīvojam (nil vai deallocate) IBOutlet, kas satur atsauces uz lietotāja saskarnes elementiem, lai pārtrauktu stipro atsauču ciklus un ļautu atbrīvot šo elementu aizņemto atmiņu. Tas novērš atmiņas noplūdi.
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidUnload() {
super.viewDidUnload()
// Atbrīvot jebkuras galvenā skata saglabātās apakšskatus.
// piemēram, self.myOutlet = nil;
myLabel = nil // Atbrīvo IBOutlet
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Šeit var atkārtoti izveidot UI elementus
if myLabel == nil {
// Ja nepieciešams, atkārtoti izveidot vai inicializēt
}
}
}
Svarīgi atzīmēt, ka no iOS 6 un jaunākajām versijām viewDidUnload metode tika likvidēta un vairs netiek izsaukta. Atmiņas pārvaldība tagad ir automatizēta, izmantojot Weak References (@IBOutlet weak) un Automatic Reference Counting (ARC). IBOutlet, kas ir atzīmēti kā weak, automātiski kļūst par nil, kad attiecīgais skata objekts tiek izkrauts no atmiņas.
Tādēļ mūsdienu iOS izstrādē īpaša IBOutlet atbrīvošana viewDidUnload nav nepieciešama un nav efektīva.