Sobes.tech
Junior — Middle

Je možné implementovať slabé odkazovanie na objekt poľa?

sobes.tech AI

Odpoveď od AI

V iOS (Objective-C alebo Swift) sú slabé odkazy (weak) zvyčajne aplikované na objekty, aby sa zabránilo cyklom držania a únikom pamäte. Avšak, polia (NSArray, NSMutableArray alebo Array v Swift) predvolene ukladajú silné odkazy na svoje prvky.

Na implementáciu poľa so slabými odkazmi je možné použiť špecializované kontajnery, ako napríklad NSPointerArray s možnosťou slabých odkazov. NSPointerArray umožňuje ukladať slabé odkazy na objekty a automaticky ich odstraňuje, keď je objekt uvoľnený.

Príklad v Objective-C:

NSPointerArray *weakArray = [NSPointerArray weakObjectsPointerArray];

NSObject *obj = [[NSObject alloc] init];
[weakArray addPointer:(__bridge void * _Nullable)(obj)];

// Keď je obj uvoľnený, weakArray sa automaticky aktualizuje

V Swift-e môžete obaliť objekty do slabých kontajnerov alebo použiť NSPointerArray cez mostík:

let weakArray = NSPointerArray.weakObjects()
let obj = NSObject()
weakArray.addPointer(Unmanaged.passUnretained(obj).toOpaque())

Týmto spôsobom neexistuje priama slabá referencia na bežný pole, ale je možné použiť NSPointerArray alebo vytvoriť vlastné štruktúry so slabými odkazmi.