1월 1일, convenience init은 왜 무한루프일까?

2023. 1. 1. 23:10iOS

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")
    }
}

start1이 무한호출된다.

 

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