Защо трябва да освобождаваме IBOutlet-ите в метода viewDidUnload?
sobes.tech AI
Отговор от AI
viewDidUnload се извиква след като изгледът на контролера бъде изтеглен от паметта, обикновено поради недостиг на ресурси. В този метод освобождаваме (nil или deallocate) IBOutlet, които държат препратки към елементите на потребителския интерфейс, за да прекъснем цикли от силни препратки и да позволим освобождаването на паметта, заета от тези елементи. Това предотвратява течове на памет.
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
override func viewDidUnload() {
super.viewDidUnload()
// Освобождаване на всякакви подпрозорци на основния изглед.
// например, self.myOutlet = nil;
myLabel = nil // Освобождаваме IBOutlet
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// UI елементите могат да бъдат създадени отново тук
if myLabel == nil {
// Създайте отново или инициализирайте етикета, ако е необходимо
}
}
}
Важно е да се отбележи, че от iOS 6 и по-късно, методът viewDidUnload е премахнат и вече не се извиква. Управлението на паметта за изгледите сега е автоматизирано чрез Weak References (@IBOutlet weak) и Automatic Reference Counting (ARC). IBOutlet-ите, маркирани като weak, автоматично стават nil, когато съответният обект на изгледа бъде изтеглен от паметта.
Затова в съвременната разработка за iOS, явно освобождаване на IBOutlet-ите в viewDidUnload не е необходимо и няма ефект.
| Версия iOS | Поведение на viewDidUnload |
Препоръка за IBOutlet |
|---|---|---|
| До iOS 6 | Извиква се при изтегляне на изгледа от паметта. | Да се задава nil. |
| iOS 6+ | Не се извиква. | Да се използва weak. |