아리의 iOS 탐구생활

[iOS/UIKit] init(frame:)와 init(coder:) 본문

Swift/iOS

[iOS/UIKit] init(frame:)와 init(coder:)

Ari Lee 2021. 12. 1. 16:14
반응형

UIView 요소를 코드로 직접 커스텀하여 사용하기 위해 만들던 와중에

override 이니셜라이저와 required 이니셜라이저,

총 2개의 이니셜라이저를 정의해야한다는 것을 알게되었다.

 

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

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

근데 이 둘의 정체는 뭘까..?? 

왜 재정의하며 파라미터로는 각각 다른 타입을 받고있는데, 어떤 것을 초기화하는 것일까?

한번 알아보자.

 

 


 

# init(frame:)

 

Apple Developer Documentation

 

developer.apple.com

코드로 UIView Class의 View 인스턴스를 만들기 위해 지정된 이니셜라이저.

Frame rectangle을 가지고 구현하고자 하는 뷰의 중심과 경계선을 지정해준다.

스토리보드, xib, nib 같은 인터페이스 빌더를 사용하지 않고

코드로 UIView Calss의 View object를 만들기 위해 지정된 이니셜라이저다.

 

 

 

# init(coder:)

 

Apple Developer Documentation

 

developer.apple.com

기본적으로 storyboardxib를 활용하면 별도의 코딩 없이 앱의 속성을 수정할 수가 있는데 이것을 가능하게 해주는 과정을 unarchiving이라고 한다.

 

Interface builder는 코드가 아니기 때문에 앱을 컴파일 하는 시점에서 컴파일러가 인식할 수 없고 이를 코드로 변환해주는 unarchiving 과정이 필요하다는 것이다.

 

이 과정에서 init?(coder:)가 사용된다.

파라미터 coder를 통해 NSCoder 타입의 객체가 전달되는 것이고

전달된 NSCoder 타입의 객체가 decoding되어 초기화된 후 컴파일 할 수 있게 decoding된 자기자신(self)을 반환하는 작업이라고 보면 될 것 같다.

 

내가 구성한 View의 상태를 앱의 disk에 저장하는 과정을 serialize라고 한다.

deserialize는 반대로 disk에 저장된 상태를 불러오는 작업이라고 볼 수 있다. 

NSCoding이라는 프로토콜을 통해 이 serialize와 deserialize 작업이 가능해진다.

 

따라서 init(coder:)의 용도를 정리하자면 아래와 같다.

Storyboard라는 인터페이스 빌더를 사용하여 뷰의 상태를 수정할 경우 serialization 작업을 Xcode가 init(coder:)를 호출하여 앱 내 뷰 작업을 저장하고 불러오는 작업을 해준다.

 

UIView 선언부를 보면 NSCoding 프로토콜을 채택하고 있는데 NSCoding 선언부를 살펴보면 실패가능한 이니셜라이저를 작성하도록 되어있다.

프로토콜을 준수하는 클래스에서 프로토콜에서 요구하는 이니셜라이저 요구사항을 구현하려면 required 키워드가 붙어야 한다.

따라서 이를 상속받은 커스텀뷰 같은 클래스에서는 스토리보드를 사용하고 있지 않지만 init?(coder:) 구현해줘야 하고 앞에 required 붙여주어야 한다.

 

 

 

 

 

# Reference

 

[iOS] init(frame:), init(coder:)

스토리보드 없이 앱을 만들다 보면 아래와 같은 override init(frame:) 과 required init?(coder:) 이 필요한 것을 알 수 있다.단순히 필요해서 썻었지 왜 필요한지는 제대로 알아보지 않은 것 같아서 공부한

velog.io

 

반응형

'Swift > iOS' 카테고리의 다른 글

[iOS/UIKit] Frame vs Bounds  (0) 2021.12.02
[iOS] Delegation 패턴에 대해서 알아보자.  (0) 2021.12.02
[iOS/Swift] TDD와 Unit Test  (0) 2021.11.23
[iOS/UIKit] prepare method 알아보기  (0) 2021.10.28
[iOS/UIKit] UIStepper Tutorial  (0) 2021.10.27
Comments