-Navigation bar에 right button을 두고 클릭했을 때 실행되는 메서드를 적어놓았는데 버튼을 눌러도 메서드가 실행되지 않는 오류를 겪었다. 그 때 button을 lazy var로 구성하니 메서드 실행이 가능해졌다.
-이유도 모르고 사용하는 것보다 lazy가 하는 역할이 무엇인지 정확히 개념을 파악하고 사용하는 것이 중요하기 때문에 deep diving 해보고자 한다.
lazy
-lazy stored property(지연 저장 속성)은 해당 인스턴스가 초기화 될 때 초기화되지 않고, 이 property에 처음 접근하는 시점에 초기화된다. (초기화 시점을 지연시켜주는 역할)
-메모리를 관리하기 위해서 코드를 짤 때 메모리 비용이 많이 들어갈 수 있는 작업은 최대한 지양하는 것이 중요하다. lazy는 이 비싼 작업이 필요로 할 때만 가져와서 사용할 수 있도록 해주는 것이다. (사용하기도 전에 불러오기 부담스러운 것들에 대해 lazy 선언을 해줌으로써 processing time을 절약해준다.)
ex)
struct test {
let name : String = "test"
let age : Int = 17
let image : UIImage = UIImage(named : testImage)
}
let exmaple1 = test()
다음과 같이 구조체 test에서 내부 프로퍼티를 보면 name과 age는 각각 String, Int 형태이기 때문에 메모리에 저장되는 크기가 크지 않다. 반면에 image는 UIImage 형태로 메모리에 저장되는 크기가 상대적으로 크다.
굳이 인스턴스의 초기화 시점에서 image 프로퍼티에 접근하지 않는다면 lazy를 통해서 메모리 낭비를 줄일 수 있다.
struct test {
let name : String = "test"
let age : Int = 17
lazy var image : UIImage = {
let exImage = UIImage(named : testImage)
return exImage
}()
}
var exmaple1 = test()
image 프로퍼티 앞에 lazy를 붙여줌으로써 image 프로퍼티에 접근하지 않는 이상, 메모리에 올라가지 않아서 메모리를 효율적으로 사용할 수 있게되었다.
example 인스턴스를 var로 바꿔준 이유는 example이 생성된 후 image에 접근할 때 초기화되기 때문에 값을 바꿔줄 수 있는 형태인 var로 선정한 것이다.
-항상 lazy property를 variable로 선언해야한다. 왜냐하면 property 초기값을 인스턴스 초기화가 완료된 시점까지 알 수 없기 때문이다.
-Struct와 Class에서만 사용이 가능하다.
-lazy는 처음 사용될 때 메모리에 값을 올리고 이후에는 계속 메모리에 올라온 값만 사용하기 때문에 사용할 때마다 연산한 값이 사용되는 Computed Property에는 사용이 불가능하다.
lazy에서 연산을 통한 값을 이용하기 위해서는 closure를 사용해야 한다.
-자동으로 초기화되지 않기 때문에 thread safe 하지 않다.
-내가 겪었던 문제에 대한 이유와 해답
이유 : 정확하지는 않지만, navigation bar가 생성될 때와 navigating button method가 생성될 때의 생성 시점 순서가 달라서 문제가 생겼던 것 같다. 즉, bar가 생성된 후 button과 함께 method가 생성되야 하는데 순서가 바뀌거나 동일해지면서 method 실행이 불가능해졌던 것이다.
해답 : lazy를 통해 순서를 바꿔 해결할 수 있었다. 정확하게 말하면 lazy를 통해 속성에 접근하기전까지 초기화가 되지 않아서 bar가 먼저 초기화되고, button은 접근할 때 초기화되는 순서를 가질 수 있었던 것.
참고:
[Swift] lazy 키워드 (tistory.com)
[Swift] lazy Variables (tistory.com)
[Swift] lazy var ? Lazy Stored Property 에 대하여 (tistory.com)
'Swift' 카테고리의 다른 글
제네릭(Generic)에 관하여 (0) | 2022.11.23 |
---|---|
Protocol에 관하여 (0) | 2022.11.14 |
순환참조에 관하여 (0) | 2022.09.28 |
@escaping에 관하여 (0) | 2022.08.25 |
Class와 Struct (0) | 2022.07.04 |