https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
ViewController에서 view를 load해올 때 실행되는 loadView함수와 관련된 문제이다.
사실 '문제'라고 하기엔 그냥 apple이 의도한 사항인 것 같긴 하지만 내가 알고 있던 개발 상식으론 선뜻 동작구조가 이해가 되지 않는 일이라 문제라고 지칭했다.
일반적으로 ViewController의 view를 만드는 방법은 크게 2가지이다.
- code로 View짜기
- xib로 View짜기
문제가 되는 부분은 2번 xib로 View짜기 일 때이다.
아래 가이드 문서를 읽어보면 xib로 view를 만들 땐 loadView 함수를 override하지 말라고 되어있다.
근데 난 이 'must not'의 의미를 '굳이 그럴 필요 없다.' 정도의 의미로 해석했지 '하면 큰일 난다'의 의미로 해석하진 않았다.
이제 xib로 view생성 시 loadView를 override하면 발생하는 상황을 보자
아무 것도 안 뜬다. 그냥 view가 load되지 않은 거다.
super.loadView를 호출하지 않은 거냐고 할 수 있지만 아니다. 호출 했다.
import UIKit
class ViewController: TSViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func loadView() {
super.loadView()
}
}
내가 아까 말했던 동작구조가 이해되지 않는다는 의미가 이 부분 때문이었다. super.loadView()를 호출함으로써 super class와 동작을 일치 시켰음에도 불구하고 view가 load되지 않는다는게 이해가 되지 않았다.
이 현상 때문에 loadView함수에 모니터링과 관련된 솔루션 장착을 하지 못하는 불상사가 생겼다. 대신에 loadView를 swizzle을 하면 정상적으로 동작하긴 하는데, 알다시피 swizzle자체가 OS가 업데이트 시 어떤 이슈가 발생할지 모르는 리스크가 있기 때문에 권장되진 않는다.
Appendix
찾아보니 objective-c로 가면 selector를 이용해서 현재 호출되는 함수가 override되었는지 알 수 있는 방법이 있는 듯한데 굳이 이렇게 구현을 한 의도는 여전히 잘 모르겠다. 뭐 어쨌든 제작자의 의도가 그렇다니 의도에 맞게 사용해주자.
'iOS > 이슈' 카테고리의 다른 글
[iOS Issues] NWPathMonitor thread safety crash issue (0) | 2024.11.10 |
---|---|
[iOS Issue] Multi thread 환경에서 Dangling Pointer Crash 이슈 (0) | 2024.05.05 |
[iOS Issue] command codesign failed with a nonzero exit code (0) | 2024.03.17 |
[iOS Issue] Shadow 관련 run time issue (0) | 2023.01.07 |
[iOS Issue] iOS12에서 Constraint의 priority 사용 시 크래시 발생 (0) | 2022.08.17 |
댓글