내일배움캠프 18일차

임클·2025년 3월 26일

내일배움캠프

목록 보기
18/44
post-thumbnail

일정


SnapKit을 사용해보면서 헷갈렸던 부분 정리

  • offset/inset
  • translateAutoresizingMaskIntoContraints

https://leesangdo.tistory.com/243


트러블 슈팅

문제 상황:

처음에는 authorValueLabel, releasedValueLabel, pagesValueLabelcomputed property로 선언하여, 다음과 같이 구현했습니다:

private var authorValueLabel: UILabel {
    makeAttributeValueLabel(for: .author)
}

private var releasedValueLabel: UILabel {
    makeAttributeValueLabel(for: .released)
}

private var pagesValueLabel: UILabel {
    makeAttributeValueLabel(for: .pages)
}

이 코드에서 computed property는 프로퍼티가 참조될 때마다 그 값을 계산하는 방식입니다. 그러나 이 방식으로 작성된 경우, 뷰 초기화 시점에 UI 요소가 메모리에 할당되지 않아 화면에 표시되지 않는 문제가 발생했습니다.

문제 분석:

computed property는 매번 프로퍼티를 참조할 때마다 값을 계산하지만, 이는 초기화 시점에 화면에 UI 요소가 렌더링되지 않는 문제를 초래했습니다. 왜냐하면, 이 프로퍼티들은 실제 UI 요소가 필요할 때마다 계산되기 때문에 뷰의 초기화 시점에서 UI가 화면에 나타나지 않게 됩니다. 이로 인해, UILabel들이 초기화되지 않고 화면에 표시되지 않았습니다.

해결 방법:

이를 해결하기 위해, lazy를 사용하여 프로퍼티를 선언하는 방법으로 수정했습니다:

private lazy var authorValueLabel = makeAttributeValueLabel(for: .author)
private lazy var releasedValueLabel = makeAttributeValueLabel(for: .released)
private lazy var pagesValueLabel = makeAttributeValueLabel(for: .pages)

인과 관계:

  1. 초기화 시점 지연: lazy를 사용하면, 프로퍼티가 처음으로 접근될 때만 초기화가 발생합니다. 이렇게 하면 UI 요소들이 뷰가 실제로 화면에 표시될 때에만 초기화되어, 불필요한 초기화가 이루어지지 않게 됩니다. 또한, 뷰가 화면에 표시될 때마다 UILabel들이 정확하게 초기화되며 화면에 렌더링됩니다.
  2. 메모리 최적화: lazy를 사용하면 UI 요소들이 필요할 때만 메모리에 할당되므로 메모리 낭비를 줄일 수 있습니다. 이는 특히 UI 요소들이 자주 사용되지 않는 경우에 유리한 방식입니다.
  3. UI 요소의 초기화 타이밍 조절: lazy는 UI 요소들의 초기화 타이밍을 뷰가 화면에 추가될 때까지 지연시킬 수 있기 때문에, 뷰의 상태나 데이터에 맞춰 UI가 정확히 초기화되도록 보장합니다. 따라서 UI가 화면에 표시되기 전에 불필요한 계산을 방지하고, 필요할 때만 계산이 이루어집니다.

결론:

lazy를 사용함으로써 UI 요소들의 초기화를 뷰가 화면에 표시될 때로 지연시켜 메모리 최적화UI 초기화의 정확성을 높일 수 있었습니다. computed property로 초기화하면 UI 요소들이 제대로 초기화되지 않거나 화면에 나타나지 않는 문제가 발생할 수 있기 때문에, lazy 프로퍼티로 변경하여 이를 해결했습니다.

0개의 댓글