본문 바로가기

iOS

ViewController Life Cycle

728x90
반응형
SMALL

ViewController Life Cycle 예제 코드

import UIKit
class NewViewController: UIViewController {
    override func loadView() {
        print("loadView")
        // 뷰 계층 구조를 만드는 코드
        // 이 메서드에서는 반드시 super.loadView()를 호출해야 합니다.
        super.loadView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("newVC_viewDidLoad")
        view.backgroundColor = .blue
        // 뷰 컨트롤러의 뷰가 메모리에 로드된 후 실행되는 코드
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("newVC_viewWillAppear")
        // 뷰 컨트롤러의 뷰가 화면에 나타나기 직전에 실행되는 코드
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print("newVC_viewWillLayoutSubviews")
        // 뷰 컨트롤러의 뷰가 서브뷰들과 함께 레이아웃을 업데이트하기 직전에 실행되는 코드
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        print("newVC_viewDidLayoutSubviews")
        // 뷰 컨트롤러의 뷰가 서브뷰들과 함께 레이아웃을 업데이트한 후 실행되는 코드
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("newVC_viewDidAppear")
        // 뷰 컨트롤러의 뷰가 화면에 나타난 직후 실행되는 코드
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("newVC_viewWillDisappear")
        // 뷰 컨트롤러의 뷰가 화면에서 사라지기 직전에 실행되는 코드
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("newVC_viewDidDisappear")
        // 뷰 컨트롤러의 뷰가 화면에서 사라진 후 실행되는 코드
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        print("newVC_didReceiveMemoryWarning")
        // 메모리 부족으로 뷰 컨트롤러가 경고를 받았을 때 실행되는 코드
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        print("newVC_viewWillTransition")
        // 뷰 컨트롤러의 뷰가 회전할 때 실행되는 코드
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print("newVC_traitCollectionDidChange")
        // 뷰 컨트롤러의 화면 구성 요소가 변경될 때 실행되는 코드
    }
    deinit {
        print("newVC_deinit")
        // 뷰 컨트롤러가 메모리에서 해제될 때 실행되는 코드
    }
}
class ViewController: UIViewController {

    override func loadView() {
        print("loadView")
        // 뷰 계층 구조를 만드는 코드
        // 이 메서드에서는 반드시 super.loadView()를 호출해야 합니다.
        super.loadView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("viewDidLoad")
        view.backgroundColor = .white
        // 뷰 컨트롤러의 뷰가 메모리에 로드된 후 실행되는 코드
        
        // 버튼 생성 및 추가
        let button = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 50))
        button.setTitle("버튼", for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        view.addSubview(button)
        // 버튼 생성 및 추가
        let memory_button = UIButton(frame: CGRect(x: 50, y: 100, width: 100, height: 100))
        memory_button.setTitle("메모리 시험", for: .normal)
        memory_button.setTitleColor(.black, for: .normal)
        memory_button.addTarget(self, action: #selector(memory_buttonTapped), for: .touchUpInside)
        view.addSubview(memory_button)
    }
    
    @objc func buttonTapped() {
           let newVC = NewViewController()
           navigationController?.pushViewController(newVC, animated: true)
       }
    @objc func memory_buttonTapped() {
        var data = [String]()
           for i in 1...1000000000000 {
               data.append("Item \(i)")
           }
           data.removeAll()
       }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("viewWillAppear")
        // 뷰 컨트롤러의 뷰가 화면에 나타나기 직전에 실행되는 코드
    }

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print("viewWillLayoutSubviews")
        // 뷰 컨트롤러의 뷰가 서브뷰들과 함께 레이아웃을 업데이트하기 직전에 실행되는 코드
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        print("viewDidLayoutSubviews")
        // 뷰 컨트롤러의 뷰가 서브뷰들과 함께 레이아웃을 업데이트한 후 실행되는 코드
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("viewDidAppear")
        // 뷰 컨트롤러의 뷰가 화면에 나타난 직후 실행되는 코드
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("viewWillDisappear")
        // 뷰 컨트롤러의 뷰가 화면에서 사라지기 직전에 실행되는 코드
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("viewDidDisappear")
        // 뷰 컨트롤러의 뷰가 화면에서 사라진 후 실행되는 코드
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        print("didReceiveMemoryWarning")
        // 메모리 부족으로 뷰 컨트롤러가 경고를 받았을 때 실행되는 코드
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        print("viewWillTransition")
        // 뷰 컨트롤러의 뷰가 회전할 때 실행되는 코드
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        print("traitCollectionDidChange")
        // 뷰 컨트롤러의 화면 구성 요소가 변경될 때 실행되는 코드
    }

    deinit {
        print("deinit")
        // 뷰 컨트롤러가 메모리에서 해제될 때 실행되는 코드
    }
}

*** 화면을 옆으로 돌렸을 때, viewWillLayoutSubviews가 두 번 호출되는 이유 ***

화면을 옆으로 돌리면 기기의 방향이 변경되므로 시스템에서는 화면을 다시 그려야 합니다. 이때 컨트롤러의 뷰도 함께 다시 그려져야 하므로 viewWillLayoutSubviews 메서드가 호출됩니다. 이때 호출된 viewWillLayoutSubviews 메서드에서는 현재 뷰의 레이아웃을 업데이트하는 작업이 수행되기 때문에, 레이아웃을 업데이트할 다시 viewWillLayoutSubviews 메서드가 호출됩니다. 따라서 화면을 옆으로 돌렸을 viewWillLayoutSubviews 메서드가 2 호출되는 것입니다.

*** 화면 전환시 호출 순서 ***

newVC_loadView

newVC_viewDidLoad

viewWillDisappear

newVC_viewWillAppear

newVC_viewWillLayoutSubviews

newVC_viewDidLayoutSubviews

viewDidDisappear

newVC_viewDidAppear

 

*** 메모리 부족 ***

도대체 언제가되야 메모리 부족현상이 일어나는지...40기가에서도 안떠서 무서워서 그냥 껐읍니다.

728x90
반응형
LIST

'iOS' 카테고리의 다른 글

강한순환참조  (0) 2023.04.28
AppDelegate  (0) 2023.04.27
iOS 면접 질문  (0) 2023.04.26
iOS 프레임워크 VS 라이브러리  (0) 2023.04.25
API 키 숨기기, xcconfig파일로  (0) 2023.04.20