Sobes.tech
Middle+

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.