[Swift] UIView와 UIViewController의 생명주기

jae·2024년 12월 25일

swift

목록 보기
13/14

react를 하면 컴포넌트의 생명주기는 기본이자 상식이다
스위프트에서 뷰의 생성에서 구성, 화면 표시, 소멸의 흐름을 관리하는 생명주기를 공부해본다

UIView의 생명주기

초기화

init(frame:)

override init(frame: CGRect) {
    super.init(frame: frame)
    settingView() 
    // ui구성 및 설정을 정의하는 함수
}

뷰가 초기화 할때 쓰는 코드
초기화할 레이아웃 설정과 기본 속성을 정의한다

init(coder:)

required init?(coder: NSCoder) {
    super.init(coder: coder)
    settingView()
}

인터페이스 빌더에서 뷰를 생성할 때 사용한다

  • 인페이스 빌더 : 그래픽 사용자 인터페이스(GUI) 디자인 도구로 스토리보드와 xib파일

뷰의 설정

awakeFromNib()

override func awakeFromNib() {
    super.awakeFromNib()
    settingView()
}

인터페이스 빌더에서 뷰를 불러온다음 호출 한다

뷰의 레이아웃

sizeThatFits(_:)

override func sizeThatFits(_ size: CGSize) -> CGSize {
    return CGSize(width: 50, height: 50)
}

뷰의 크기 계산

sizeThatFits(_:)

override var intrinsicContentSize: CGSize {
    return CGSize(width: 200, height: 100)
}

layoutSubviews

override func layoutSubviews() {
    super.layoutSubviews()
    myCustomLayout()
}

뷰의 크기와 위치가 변경 시
뷰의 서브 뷰가 추가혹은 제거 시
오토레이아웃의 제약 조건이 변경 시
setNeedsLayout() 또는 layoutIfNeeded()가 호출되었을 때
프레임이나 오토레이아웃을 동적으로 설정할떄 사용된다

복잡하지않고 가벼온 코드를 작성해야한다
layoutSubviews 내부에서 setNeedsLayout()를 호출하면 루프지옥 발생

  • setNeedsLayout() : 비동기 호출로 layoutSubviews를 호출 하나 즉시 호출 되는 것 아님
  • layoutIfNeeded() : 즉시 호출로 layoutSubviews를 실행

뷰의 렌더링

draw(_:)

override func draw(_ rect: CGRect) {
    guard let context = UIGraphicsGetCurrentContext() else { return }
    context.setFillColor(UIColor.red.cgColor)
    context.fill(rect)
}

그리기작업을 커스터마이징한다
Core Animation이나 Core Graphics을 사용해서 구현할떄 사용한다

  • setNeedsDisplay() : 뷰다시 그리기 draw를 호출

메모리 관리 단계

deinit

deinit {
    print("뷰가 없어집니다")
}

뷰가 메모리에서 해제될떄 호출된다

요약

즉 UIView의 생명주기는 init으로 뷰를 설정하는 초기화 단계,
layoutSubviews()와 updateConstraints()로 서브뷰의 크기나 위치를 동적으로 설정하는 레이아웃 설정단계
removeFromSuperview()로 뷰를 제거하거나 deinit으로 메모리를 정리하는 종료의 3단계로 나뉜다


UIViewController의 생명주기

생성과 초기화

init(nibName:bulte:)

코드베이스 개발 시 생성 할떄 호출
뷰컨트롤러의 초기 설정

init(coder:)

인터페이스 빌더에서 로드될떄 호출

로딩

loadView

override func loadView() {
    view = myCustomView()
}

뷰 컨트롤러가 관리할 뷰를 생성

viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    setUI()
}

뷰가 로드된 직후 호출하여 초기 설정과 데이터 바인딩을 한다

화면 표시 전

viewWillAppear

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    addSetUI()
}

뷰가 화면에 나타나기 직전에 호출

화면 표시 이후

viewDidAppear

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    startAnimation()
}

뷰가 화면에 나타난 직후에 호출된다
viewWillAppear 에서 셋팅한 애니메이션같은 것들이 시작된다

화면 사라지기 전

viewWillDisappear

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    removeAnimation()
}

뷰가 화면에서 사라지기 직전에 호출한다
애니메이션 정지 및 데이터를 저장한다

화면 사라진 후

viewDidDisappear

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    cleanUI()
}

뷰가 화면에서 사라진 뒤에 호출한다
리소스를 정리하고 현재 상태를 를 저장한다

메모리 관리

didReceiveMemoryWarning

메모리 부족할 경우 호출하며 불필요한 리소스를 해제한다

deinit

타이머와 NotificationCenter 옵저버, 뷰컨트롤러가 해제하거나 네트워크 요청 취소해야할 시 호출

0개의 댓글