lazy로 선언하지않고 바로 초기화해주는 인스턴스가 우리같은 프로젝트에서 조금만 사용된다면 상관이 없지만 이게 1000개 이상이되면 성능과 메모리에 영향을 받는다. 그렇기 때문에 공식문서에 내용대로 가능하면 lazy로 초기화해주는게 좋다. ?
[lazy의 장점]
- lazy 프로퍼티와 관련된 클로저는 해당 프로퍼티를 읽을때만 실행된다. 따라서 어떤 이유로 해당 프로퍼티가 사용되지않는 경우 불필요한 할당 및 계산을 피할 수 있따.
- 저장 프로퍼티값으로 lazy프로퍼티를 채울 수 있음
lazy var label: UILabel = {
let label = UILabel()
return label
}()
- self를 클로저내부에 사용할 수 있다. 이는 어떤 순환참조을 일으키 않는다. 이유는 {}()가 @noescape로 자동으로 적용되기떄문이다. 따라서 외부에서 접근하는 것이 아니므로 캡쳐를 할 필요가 없다.
- 실제로 구조체가 아닌 클래스를 사용하는 경우 강력한 참조 주기를 생성하지않도록 함수내부에 unowner self도 선언해야함
# lazy프로퍼티는 처음에 필요할때만 계산되고 이후에는 저장이되는 원리이다. 고루 두번째 호출부터는 저장한 값이 반환된다.
- lazy는 원자적으로 초기화되지않기에 스레드로 부터 안전하지않다. 이말은 즉슨 비동기작업을 할때 멀티스레드가 동시에 lazy에 접근하게되면 동시에 한개가 아닌 두개가 메모리에 올라가는 현상이 발생할 수 있기때문에 안전하지않다 라고 이해했음
- lazy를 사용하게되면 수많은 인스턴스를 초기화해야하는 클래스를 빠르게 초기화하여 빌드속도를 높일 수 있다는 장점이 있다.
[lazy의 규칙]
- let과 함께사용할 수 없다. 이 프로퍼티의 초기값을 인스턴스 초기화가 완료된 시점까지 알 수 없기때문이다. let은 초기화가 끝나기전까지 반드시 값을 가져야하기 때문에? lazy로 선언될 수 없다. 이부분은 이해가 잘 되지않는다.
- computed Properties와 함께 사용할 수 없다. 왜냐하면 값을 사용할때마다 반환하기되며 저장할 수 없기때문
- lazy를 오직 struct와 class의 멤버로만 사용할 수 있다. 이유는... 저장프로퍼티는 struct와 class만 가질 수 있으니깐 ..?
'면접질문정리' 카테고리의 다른 글
[Architecture] Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오. (0) | 2022.08.22 |
---|---|
[iOS] UIWindow의 역할은? (0) | 2022.08.22 |
[Swift] 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요. (0) | 2022.08.22 |
[iOS] View Life Cycle (feat. drawing cycle) 호출순서? (0) | 2022.08.22 |
[Swift] Result Type이란? (0) | 2022.08.22 |