Sobes.tech
Junior — Middle

Jak zaimplementować przechowywanie obiektów za pomocą słabych referencji w kolekcji?

sobes.tech AI

Odpowiedź od AI

Na iOS, aby przechowywać obiekty za pomocą słabych referencji w kolekcjach, można użyć kilku podejść, ponieważ standardowe kolekcje (np. Array, Set, Dictionary) przechowują silne referencje do obiektów, co może prowadzić do utrzymywania obiektów w pamięci dłużej niż jest to konieczne.

Główne metody:

  1. Użycie opakowania z właściwością weak

Tworzy się klasę opakowania, która zawiera słabą referencję do obiektu. Takie opakowania są dodawane do kolekcji zamiast samych obiektów.

class WeakRef<T: AnyObject> {
    weak var value: T?
    init(value: T) {
        self.value = value
    }
}

var weakArray = [WeakRef<MyClass>]()

let obj = MyClass()
weakArray.append(WeakRef(value: obj))
  1. Użycie NSHashTable lub NSMapTable

Te klasy z Foundation pozwalają na bezpośrednie przechowywanie słabych referencji.

let weakSet = NSHashTable<MyClass>.weakObjects()
weakSet.add(obj)

NSHashTable z opcją weakObjects automatycznie przechowuje obiekty słabo, a gdy obiekt jest usuwany, jest usuwany z kolekcji.

W ten sposób, do słabego przechowywania obiektów w kolekcjach na iOS, najczęściej używa się NSHashTable lub opakowań z właściwościami weak.