1월 1일, convenience init은 왜 무한루프일까?
2023. 1. 1. 23:10ㆍiOS
import UIKit
class ViewController: UIViewController {
let subView = SubView() //초기화
override func viewDidLoad() {
super.viewDidLoad()
}
}
class SubView: UIView {
convenience init(){
print("start1") //start1이 무한호출된다.
self.init()
print("end1")
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

Convenience init 내부에서 반드시 Designated Init이 호출되어야 한다 ➡️ self.init() 했는데? but..


즉, 위의 그림과 같은 룰로 호출해야하는데 init()이 convenience init() 밖에 없으므로 자기자신을 계속 호출하게 되는 것이다.
그렇다면 어떻게 수정해야할까? 여러 방법 중 하나는 아래와 같다.
import UIKit
class ViewController: UIViewController {
let subView = SubView() //초기화
override func viewDidLoad() {
super.viewDidLoad()
}
}
class SubView: UIView {
convenience init(){
print("start1")
//self.init()
self.init(frame: .zero) //designated init을 호출
print("end1")
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
designated init을 호출하도록 수정하면, 더 이상 무한루프에 빠지지않고 override init을 호출한다.
'iOS' 카테고리의 다른 글
ㅜㄷㅌㅅ (0) | 2023.01.22 |
---|---|
https://velog.io/@eddy_song/stack-view (0) | 2023.01.07 |
Then (0) | 2023.01.06 |
required init?(coder: NSCoder), init 마지막 (0) | 2023.01.03 |
UIView.init()를 알아보자. (0) | 2023.01.02 |