Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] (기본기) 코드 실행과 메모리 적재 타이밍 본문

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")
    }
}
Comments