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 |