Junior — Middle
Amikor átadunk vagy létrehozunk egy lezárást, másolódik vagy referencia szerint kerül átadásra?
sobes.tech MI
Válasz az MI-től
Az iOS (Swift/Objective-C) esetén a zárványok (closures) referencia szerint kerülnek átadásra, nem másolódnak át a továbbítás vagy létrehozás során. A zárvány maga referencia típus.
Azonban, külső kontextusból változókat fogva, a zárvány másolatokat készíthet ezekből az értékekből (például, ha struct típusú értékek), vagy referencia szerint foghatja őket (ha osztályok).
Swift példával:
var x = 10
let closure = { print(x) } // a zárvány érték szerint fogja x-et (másolat)
x = 20
closure() // kiírja az 10-et, mivel x-et másolatként fogta el
Amikor egy zárványt átadunk egy függvénynek vagy változóban tároljuk, referencia szerint kerül átadásra, nem az egész törzs másolata.
Ezért a zárványok referencia szerint kerülnek átadásra, de a fogott változók másolhatók vagy referencia szerint foghatók attól függően, hogy milyen típusúak és milyen kontextusban.