Sobes.tech
Junior — Middle

Czy możliwe jest zaimplementowanie mechanizmu, który śledzi obiekty za pomocą słabych referencji, nie uniemożliwiając ich usunięcia przez zbieracz śmieci?

sobes.tech AI

Odpowiedź od AI

Tak, na iOS (i w Swift) istnieje mechanizm słabych odniesień (weak references), który pozwala śledzić obiekty bez ich utrzymywania w pamięci i zapobiega ich usunięciu przez zbieracz śmieci (ARC).

Słabe odniesienie nie zwiększa licznika odniesień obiektu, więc gdy nie pozostają żadne silne odniesienia, obiekt jest zwalniany z pamięci.

Przykład użycia słabego odniesienia w Swift:

class Person {
    let name: String
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    weak var tenant: Person?  // słabe odniesienie
}

var person: Person? = Person(name: "Ivan")
var apartment: Apartment? = Apartment()
apartment?.tenant = person

person = nil  // obiekt Person zostanie usunięty, ponieważ nie ma silnych odniesień

print(apartment?.tenant)  // nil

W ten sposób słabe odniesienia pozwalają śledzić obiekty, nie przeszkadzając w ich usunięciu.