Sobes.tech
Middle

Proč bychom měli uvolnit IBOutlety v metodě viewDidUnload?

sobes.tech AI

Odpověď od AI

viewDidUnload se volá po tom, co je pohled kontroléru odvolán z paměti, obvykle kvůli nedostatku zdrojů. V této metodě uvolníme (nil nebo deallocate) IBOutlet, které drží odkazy na prvky uživatelského rozhraní, aby se přerušily cykly silných odkazů a umožnilo se uvolnění paměti obsazené těmito prvky. To zabraňuje únikům paměti.

class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!

    override func viewDidUnload() {
        super.viewDidUnload()
        // Uvolnit jakékoliv podzobrazení hlavního pohledu.
        // např., self.myOutlet = nil;
        myLabel = nil // Uvolnění IBOutlet
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // UI prvky zde mohou být znovu vytvořeny
        if myLabel == nil {
            // Znovu vytvořit nebo re-inicializovat štítek podle potřeby
        }
    }
}

Je důležité poznamenat, že od iOS 6 a novější je metoda viewDidUnload odstraněna a již není volána. Správa paměti pro pohledy je nyní automatizovaná pomocí Weak References (@IBOutlet weak) a Automatic Reference Counting (ARC). IBOutlet označené jako weak se automaticky stanou nil, když odpovídající objekt pohledu je odvolán z paměti.

Proto v moderním vývoji iOS není nutné ani efektivní explicitně uvolňovat IBOutlet v viewDidUnload.

Verze iOS Chování viewDidUnload Doporučení pro IBOutlet
Do iOS 6 Volá se při odvolání pohledu z paměti. Nastavit na nil.
iOS 6+ Není voláno. Používat weak.