iOS 기본 (swift)
[iOS - swift] (기본기) 코드 실행과 메모리 적재 타이밍
jake-kim
2024. 5. 31. 01:48
코드 실행
- 아래와 같이 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")
}
}