Sobes.tech
Middle

Hogyan lehet osztályobjektumokat erős hivatkozással tárolni egy tömbben?

sobes.tech MI

Válasz az MI-től

Osztályobjektumok tömbben alapértelmezés szerint erős hivatkozásokkal vannak tárolva Swiftben, ha a tömb osztálytípusú elemeket tartalmaz. Egy [MyClass] vagy Array<MyClass> tömb erős hivatkozásokat tartalmaz a MyClass példányaira.

Példa:

class MyClass {
    let id: Int
    init(id: Int) {
        self.id = id
        print("MyClass \(id) létrehozva")
    }
    deinit {
        print("MyClass \(id) felszabadítva")
    }
}

var erősHivatkozásokTömbje: [MyClass] = []

for i in 0..<3 {
    let obj = MyClass(id: i)
    erősHivatkozásokTömbje.append(obj) // A tömb erős hivatkozásokat tart fenn
}

print("A tömb \(erősHivatkozásokTömbje.count) elemet tartalmaz")

// Az objektumok nem lesznek felszabadítva, amíg erős hivatkozások vannak a tömbben
// Az array-nek `nil`-t adva vagy elemeket törölve felszabadulnak,
// ha nincs más erős hivatkozás.

// erősHivatkozásokTömbje = [] // Példa az összes erős hivatkozás felszabadítására
// erősHivatkozásokTömbje.remove(at: 0) // Példa egy erős hivatkozás felszabadítására

Swiftben a értéktípusú (struct) vagy enumerációs (enum) tömbök másolatokat tárolnak az elemeikről. Azonban, ha a tömb osztálypéldányokat (class) tartalmaz, erős hivatkozásokat tárol ezekre az példányokra.