Sobes.tech
Middle

Защо трябва да освобождаваме 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.