Open HeegeePark opened 1 year ago
값 타입에서 값이 변경되지 않았을 때에도 계속 새로 복사하는 것은 비용이 많이 든다. 따라서 변경하지 않을 때는 같은 주소를 참조하고 있다가 값이 변경되었을때 복사가 일어나도록 한다.
사용자가 정의한 구조체에서는 이것이 구현되어 있지 않다. 따라서 아래와 같이 구현해야된다.
struct MediaItem { fileprivate class MediaData { var name:String var format:[String:String] init(name:String, format:[String:String]) { self.name = name self.format = format } } private var data:MediaData init(name:String, format:[String:String]) { data = MediaData.init(name: name, format: format) } } extension MediaItem { public var name:String { get { return data.name } set { // 이미 copy가 되었는지 아닌지 확인 if !isKnownUniquelyReferenced(&data){ self.data = self.data.copy() } self.data.name = newValue } } } extension MediaItem.MediaData { func copy() -> MediaItem.MediaData { return MediaItem.MediaData.init(name: name, format: format) } } // 출처 : https://ichi.pro/ko/swift-copy-on-write-choejeoghwa-77728322183901
Copy On Write는 A라는 변수에 B라는 변수를 할당해주었을 때, 새로 메모리에 할당하는 것이 아니라, B의 메모리를 A가 공유하는 형태로 구성된다. 그러다가 A가 값이 수정될 때 새로 메모리에 할당이 되는 식으로 동작한다.