Sobes.tech
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.