Swift 5.5 ile birlikte dilde ownership model ve move semantics kavramı entegre edildi, bu da veri sahipliği üzerindeki kontrolü artırarak derleyiciye taşımaları optimize etme imkanı tanıyor ve kopyalama sayısını azaltıyor, bu da yüksek performanslı senaryolar için önemlidir.
Move semantics, bir değeri (örneğin, struct) aktardığınızda, bu değerin sahipliğini kopyalamadan 'aktarma' imkanı sunduğu anlamına gelir. Bu durumda, derleyici başlangıç değişkenini geçersiz kılabilir (C++'taki move'a benzer). Şu anda ownership model ve move semantics daha çok deneysel olarak uygulanmakta (actor isolation, sendable types, @_move, consuming/self-consuming) ve kamu API'sinde yer alması beklenmektedir.
ARC'den temel fark, move semantics'in değer türlerine uygulanabilir olmasıdır, oysa ARC referans nesnelerinin yaşam sürelerini yönetir.
Örnek (sahiplik semantiği, Swift 5.5+):
func consume<T>(_ x: __owned T) { /* ... */ } struct LargeArray { var storage: [Int] mutating func clear() { storage.removeAll() } consuming func consumeSelf() { // self çağrıdan sonra erişilemez } }
Sahiplik yönetimi, büyük yapılarla çalışırken beklenmedik kopyalardan kaçınmayı sağlar.
Nuanlar:
Swift'te bir yapı nesnesinin bir fonksiyona değer olarak, referans olarak ve move semantics ile aktarımı arasındaki fark nedir?
Cevap:
Örnek:
func foo(_ x: MyStruct) { /* kopya */ } func bar(_ x: inout MyStruct) { /* referans ile */ } func baz(_ x: __owned MyStruct) { /* move semantics, kopyalamaz */ }
Hikaye
Projede büyük yapıların fonksiyonlar aracılığıyla aktarımında her zaman örtük kopyalama gerçekleşti, bu da bellek maliyetlerini artırdı. Deneysel move semantics ve daha planlı sahiplik yönetimi ile yükü yeniden dağıtmak ve kritik alanları hızlandırmak mümkün oldu.
Hikaye
Birçok geliştirici inout'u yanlış bir şekilde kullanarak move uygulandığını düşündü, oysa değer yine erişilebilir durumda kalıyordu ve belirsiz sahiplik sorunlarına yol açıyordu, bu da hatalara ve mantık bozukluklarına sebep oldu.
Hikaye
İş parçacıkları arasındaki veri yönetimi hatası: yapılarda Sendable nitelik eksikliği, bu da büyük yapılarla asenkron çalışırken beklenmedik kopyalama veya sahiplik hatalarına yol açıyordu.