Hogyan lehet gyenge hivatkozást létrehozni egy protokollt tartalmazó mezőre?
sobes.tech MI
Válasz az MI-től
A kulcsszavakat weak vagy unowned használhatja protokoll típusú mező deklarálása előtt.
protocol MyProtocol: AnyObject { // A protokollt csak osztályokra kell korlátozni
func doSomething()
}
class MyClass {
weak var delegate: MyProtocol? // Gyenge hivatkozás a MyProtocol típusú mezőre
unowned var helper: MyProtocol // Nem tulajdonolt hivatkozás a MyProtocol típusú mezőre (ha biztos benne, hogy az objektum mindig létezik)
}
Fontos megjegyezni, hogy a protokollt csak osztályokra kell korlátozni (: AnyObject), hogy gyenge vagy nem tulajdonolt hivatkozásokat lehessen használni. Ez garantálja, hogy a protokollt megvalósító típus referencia típus, nem érték típus.
A protokoll típusú mező esetében a weak akkor alkalmazandó, ha a mező által hivatkozott objektum korábban felszabadulhat, mint a tartalmazó objektum. Ha a hivatkozott objektum felszabadul, a mező automatikusan nil lesz.
Az unowned akkor alkalmazandó, ha biztos benne, hogy a mező által hivatkozott objektum mindig ugyanazzal vagy hosszabb életciklussal rendelkezik, mint a tartalmazó objektum. Az unowned használata csak akkor biztonságos, ha garantálja a körkörös hivatkozások hiányát, és biztos benne, hogy a hivatkozott objektum mindig érvényes. Ha az objektum felszabadul, és megpróbál hozzáférni az unowned hivatkozáson keresztül, akkor crash történik.
A legtöbb esetben a weak-et használják a delegáltak és más hasonló minták esetében.