Sobes.tech
Junior — Middle

Pri prenose alebo vytváraní uzáveru, sa kopíruje alebo sa odovzdáva odkazom?

sobes.tech AI

Odpoveď od AI

V iOS (Swift/Objective-C) sačuvavanja (closures) se prenose po referenci, a ne kopiraju pri predaji ili kreiranju. Sam objekat sačuvavanja je referentni tip.

Međutim, prilikom hvatanja promenljivih iz spoljnog konteksta, sačuvavanje može praviti kopije tih vrednosti (na primer, ako su vrednosti tipa struct), ili ih hvata putem reference (ako su klase).

Primer u Swift:

var x = 10
let closure = { print(x) } // sačuvavanje hvata x po vrednosti (kopira)
x = 20
closure() // ispisuje 10, jer je x hvatan kao kopija

Prilikom prosleđivanja sačuvavanja funkciji ili njegovog čuvanja u promenljivu, prosleđuje se referenca na sačuvavanje, a ne kopija celog tela.

Takođe, sačuvavanja se prenose po referenci, ali hvatače promenljive mogu biti kopirani ili hvatači po referenci u zavisnosti od njihovog tipa i konteksta.