init(frame:) init(coder:)

이건준·2022년 3월 4일
0
post-thumbnail

문제제기

-> 기존에 중복되는 뷰에 대해 CustomView나 CustomCell을 생성하기위해서 init메소드를 생성하게되면은 항상 required init(coder:)메서드를 생성하라는 문구가 뜨게된다, 기존 init메소드와 required init(coder:)메서드는 무엇이 다를까 ??

문제해결

1. init(frame:)

-> 일단 첫번째로 이 초기화메소드는 CustomView를 만들때 항상 사용해왔던 초기화메소드이다, 이 메소드는 우리가 스토리보드, xib, nib같은 인터페이스빌더를 이용하지않고 programatically하게 즉 코드로써 View객체를 사용하기위한 메소드이다, 그렇기때문에 기존에 CustomView혹은 어떤 뷰에 대한 translatesAutoresizingMaskIntoConstraints을 걸지않을때 항상 init(frame:)을 썼던 이유가 이 때문이였던것이다

-> xib: XML Interface Builder, "flat file" (아무런 구조적 상호관계가 없는 레코드들이 모여있는 파일)

-> nib: Next Interface Builder (빌드시, XIB가 NIB로 변환)

처음부터 NIB로 저장하면 될 것을, XIB로 저장하는 이유?
xib가 SCM(source control management : 소스 제어 관리)시스템에 유리하기 때문

2. init(coder:)

-> 이 초기화메소드는 위와는 달리 인터페이스빌더를 사용하여 해당 View객체를 사용할때 사용되는 메소드이다, 인터페이스빌더는 코드가 아니기 때문에 앱을 컴파일 하는 시점에서 컴파일러가 인식할 수 없고 이를 코드로 변환해주는 unarchiving 과정이 필요하다, 이 과정에서 사용되는 메소드가 init(coder:)인 것이다


-> 우리가 UIView나 UIViewController를 이용하여 만들때 이 초기화메소드가 나오는 이유는 NSCoding이라는 프로토콜때문인데 이 프로토콜에서는 초기화메소드가 구현되어있어서 이 프로토콜을 채택한곳에서는 required가 붙어 반드시 구현해야하고 UIView나 UIViewController에도 이 프로토콜을 채택하고있어서 우리가 구현해야하는것이다, 허나 왜 항상 이 초기화메소드는 우리가 새로운 초기화메소드를 정의하려고할때마다 경고문구로 뜨는것일까 ??


-> 그 이유는 우리가 아무런 초기화메소드도 사용하지않을 경우엔 Swift에서 자동으로 부모클래스의 초기화메소드를 자식클래스에서 상속받게되는데


-> 자식클래스에서 초기화메소드를 직접 생성하는순간 부모클래스의 초기화메소드를 상속받지못하게되어 우리는 자식클래스에서 이 초기화메소드를 구현해야만 하는것이다, 그리고 자식클래스에선 초기화메소드가 생성되었기때문에 부모클래스를 초기화할 수 있는 수단이 사라지게된것이고 이를 위해서 super를 이용하여 부모클래스까지 초기화시켜준것이다

0개의 댓글

관련 채용 정보