Sobes.tech
Middle — Middle+

Tudná leírni, hogyan valósította meg a Copy-on-Write mechanizmust a gyakorlatában?

sobes.tech MI

Válasz az MI-től

Az iOS Copy-on-Write (COW) mechanizmusát meg lehet valósítani a memóriahasználat optimalizálása érdekében, amikor több objektum osztja ugyanazokat az adatokat, amíg valamelyik nem próbálja meg módosítani azokat.

Gyakorlatban COW-t használtam például nagy adatszerkezetek vagy kollekciók esetén. Swiftben a standard kollekciók (Array, Dictionary, Set) már implementálják a COW-t a háttérben.

Ha saját COW mechanizmust valósít meg, általában egy burkoló osztályt hoz létre az adatok tárolására, és a szerkezet tartalmaz egy hivatkozást erre az osztályra. Az adatok módosításakor ellenőrizni kell, hogy a hivatkozás egyedi-e (isKnownUniquelyReferenced használatával), és ha nem, akkor másolatot készíteni az adatokról.

Példa:

class DataStorage {
    var data: [Int]
    init(data: [Int]) {
        self.data = data
    }
}

struct MyArray {
    private var storage: DataStorage

    init(_ data: [Int]) {
        storage = DataStorage(data: data)
    }

    mutating func append(_ value: Int) {
        if !isKnownUniquelyReferenced(&storage) {
            storage = DataStorage(data: storage.data) // adatok másolása
        }
        storage.data.append(value)
    }

    var data: [Int] {
        return storage.data
    }
}

var a = MyArray([1, 2, 3])
var b = a // b és a ugyanazokat az adatokat osztják
b.append(4) // módosításkor másolat készül
print(a.data) // [1, 2, 3]
print(b.data) // [1, 2, 3, 4]