Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리펙터링
- Xcode
- UITextView
- SWIFT
- Refactoring
- uiscrollview
- ribs
- 클린 코드
- 애니메이션
- rxswift
- UICollectionView
- 스위프트
- Protocol
- swift documentation
- HIG
- 리팩토링
- MVVM
- 리펙토링
- clean architecture
- collectionview
- map
- Observable
- Clean Code
- uitableview
- RxCocoa
- tableView
- ios
- swiftUI
- Human interface guide
- combine
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] (기본기) 코드 실행과 메모리 적재 타이밍 본문
코드 실행
- 아래와 같이 viewDidAppear에서 a()함수가 실행되면 출력되는 값은?
- "a" -> "b" -> "c" -> "deinit" 일까?
class VC: UIViewController {
deinit {
print("deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBlue
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
a()
}
func a() {
print("a")
dismiss(animated: true)
print("b")
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print("c")
}
}
}
- 정답: "a" -> "b" -> "c" -> "deinit"가 맞음
- 중요한 것: dismiss가 동작하여 곧바로 VC가 메모리에서 해제될것 같지만 그것이 아님을 주의
- 만약 아래와 같을때는 "d"만 출력됨
class VC: UIViewController {
deinit {
print("deinit")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBlue
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
a()
}
func b() {
print("d")
exit(0)
print("e")
}
}
코드 실행 이해하기
- 아래와 같은 코드가 실행되면 메모리 Text 영역에 코드를 적재하고, 순서대로 실행
- viewDidAppear가 호출되면, super.viewDidAppear(animated)라는 코드와 a()가 메모리의 Text영역에 적재되고, a()의 내용도 같이 적재됨
class VC: UIViewController {
deinit {
print("deinit")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
a()
}
func a() {
print("a")
dismiss(animated: true)
print("b")
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print("c")
}
}
}
- a()함수를 보면 print("a")부터 print("c")까지 메모리 Text영역에 적재됨
- 만약 dismiss가 실행되어도 print("c")가 아직 메모리에 적재되어 있기 때문에 print("c")가 실행될때까지는 메모리 해제가 안됨
- 그렇기 때문에 "a"만 실행되고 메모리가 해제되어 "deinit"만 출력되는게 아닌 "b"와 "c"도 출력되는 것
- 하지만 exit()이 있는 아래 코드에서는 "d"만 출력되는데, 이 이유는 exit(0)코드는 프로세스를 종료시키기 때문
- 프로세스가 종료되면 메모리 역시 같이 날리기 때문에 메모리 Text영역에 적재된 print("e")가 실행 안되는 것
class VC: UIViewController {
deinit {
print("deinit")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
b()
}
func b() {
print("d")
exit(0)
print("e")
}
}
'iOS 기본 (swift)' 카테고리의 다른 글
[iOS - swift] 앱 이름 지역화 방법 (AppName Localization) (4) | 2022.06.25 |
---|---|
[iOS - swift] 고차함수(Higher order function), Reduce 사용 방법 reduce, reduce(into:) (0) | 2022.06.24 |
[iOS - swift] 패턴 매칭(Pattern Matching) 개념 (Optional 패턴, Expression 패턴, switch 문과 ~= 연산자) (0) | 2022.06.22 |
[iOS - swift] Xcode의 Target, Project, Workspace 개념 (0) | 2022.06.16 |
[iOS - swift] Comparable (+ Clamped 기능 구현) (0) | 2022.06.10 |
Comments