일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- subject
- RFC1738/1808
- graphql
- Operators
- swift6
- init
- nonisolated
- IOS
- NullObject
- SWIFT
- Creating Operators
- typeorm
- SwiftUI
- RxSwift
- Xcode
- RxCocoa
- @EnvironmentObject
- NavigationLink
- ios14
- Operater
- init?
- Bug
- @Environment
- @Binding
- vim
- dismiss
- operator
- nestjs
- @State
- URL(string:)
- Today
- Total
Tunko Development Diary
swift) lazy variables 본문
lazy 는 반드시 var와 함께 쓰여야 합니다.
이유는 기본적으로 lazy로 선언된 변수는 초기에는 값이 존재하지 않습니다. 이후에 값이 생기는것이기에 let으로는 선언될 수 없습니다.
lazy는 반드시 데이터 유형(type)을 미리 선언해야 합니다.
lazy var value : Int {
return 1
}()
위 예제에선 Int 가 type 입니다.
struct, class 에서만 사용가능합니다.
연산프로퍼티 (Computed property) 에서는 lazy를 사용할 수 없습니다.
lazy는 처음 사용될 때 메모리에 값을 올리고 그 이후부터는 계속해서 메모리에 올라온 값을 사용합니다. 사용할 때마다 값을 연산하여 사용하는 연산프로퍼티에는 사용할 수 없습니다.
lazy 와 closure
lazy에 값을 넣어주기 위해서는 클로저를 사용합니다.
class나 struct의 다른 프로퍼티의 값을 lazy 변수에서 사용하기 위해서는 closure내에서 self를 통해 접근이 가능합니다. 기본적으로 일반 변수들은 클래스가 생성된 이후에 접근이 가능하기 때문에 클래스내의 다른 영역(메소드, 일반 프로퍼티)에서는 self를 통해 접근할 수 없지만 lazy키워드가 붙으면 생성 후 추후에 접근할 것이라는 의미이므로 closure내부에서 self접근이 가능합니다.
class LazyTest {
var param : String
init(param : String) {
self.param = param
}
lazy var getParam : String = {
return self.param
}()
}
var test = LazyTest(param : "test")
print(test.getParam) // test
test.param = "test2"
print(test.getParam) // test
클래스 내부의 클로저에서 객체를 self로 참조한다면 메모리 누수가 발생하는 위험이 있습니다.
하지만 getParam 마지막에 () 을 통해서 즉시 실행하고 결과를 돌려주기에 메모리 누수는 없습니다.
위 코드에서 param에 “test2”를 할당했지만 처음 사용 할 때 메모리에는 “test”가 올라가 있기에 “test”가 호출 됩니다.
이를 수정하기 위해선 아래와 같이 수정해야 합니다.
class LazyTest {
var param : String
init(param : String) {
self.param = param
}
lazy var getParam : () -> String = { [weak self] in
return self.param
}()
}
var test = LazyTest(param : "test")
print(test.getParam) // test
test.param = "test2"
print(test.getParam) // test2
getParam은 클로저를 반환합니다. () -> String
따라서 [weak self]를 통해서 메모리 누수를 방지해주어야 합니다.
또한 값이 아닌 클로저 자체가 메모리에 올라가 있고 self는 내부에서 계속해서 클래스를 참조하기 때문에 수정된 “test2”가 출력됩니다.
참고 :
https://www.hackingwithswift.com/example-code/language/what-are-lazy-variables
'Development > iOS 개발' 카테고리의 다른 글
SwiftUI) Navigation dismiss하기 (0) | 2022.07.21 |
---|---|
🤯 Xcode스토리보드 우측 코드 안보일 때 Assistant Results (0) | 2022.07.12 |
swift) ?? 연산자 (0) | 2022.06.20 |
associatedtype 이란? (0) | 2022.06.17 |
swift) required init 요구 이니셜라이저 (0) | 2022.06.17 |