HypeDitto / iOS-Study

iOS 기술 면접 대비
0 stars 0 forks source link

Copy On Write는 어떤 방식으로 동작하는지 설명하시오. #47

Open HeegeePark opened 1 year ago

HeegeePark commented 1 year ago

Copy On Write는 A라는 변수에 B라는 변수를 할당해주었을 때, 새로 메모리에 할당하는 것이 아니라, B의 메모리를 A가 공유하는 형태로 구성된다. 그러다가 A가 값이 수정될 때 새로 메모리에 할당이 되는 식으로 동작한다.

YouHojoon commented 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