2016-10-20 5 views
30

모두들 "그렇게 좋아하기 때문에 super.viewDidLoad()를 사용하십시오."또는 "나는 항상 그렇게 해왔으니 그대로 두십시오." "슈퍼를 부르지 않으면 잘못입니다."왜/언제 super.ViewDidLoad를 호출해야합니까?

Objective-C 사례에 대한 몇 가지 주제를 찾았지만 계몽 적이지는 않았지만 스위프트 3에서 개발 중이므로 어떤 전문가라도 이에 대한 자세한 설명을 제공 할 수 있습니까?

좋은 연습일까요? 또는 숨겨진 효과가 있습니까?

+2

https://upload.wikimedia.org/wikipedia/commons/a/a2/Method_overriding_in_subclass.png 동물처럼 움직이지 않는 개가 필요한 경우 부모 클래스를 호출 할 수 없습니다. –

+0

재정의 개념과 상속 개념을 이해합니다. 내가 알아야 할 것은 super를 부르는 것의 이점이 있다면이 특별한 경우에 있는가? 어쨌든 코드가 작동합니까? – Andr3s4n

+1

당신의 질문은 * 언어에 독립적이라는 것을 유의하십시오 * UIKit 프레임 워크의 올바른 사용법에 관한 질문입니다. 따라서 Objective-C 용으로 작성된 이전 Q & A (예 : http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method)는 유효합니다. 신속한 프로그램. –

답변

22

일반적으로 반환 값이없는 모든 재정의 함수에 대해 super를 호출하는 것이 좋습니다.

viewDidLoad의 구현을 알 수 없습니다. UIViewController 거기에 몇 가지 중요한 설정 물건을 할 수 있고 그것을 호출하지 않을 것이라고 자신의 viewDidLoad 코드를 실행할 기회를주지 않을 것입니다.

UIViewController 하위 클래스에서 상속하는 경우와 동일한 작업이 수행됩니다.

super.viewDidLoad으로 전화를 걸어도 아무 것도하지 않더라도 언제나 전화하는 것은 좋은 습관입니다. 전화하지 않는 습관에 빠지면 필요할 때 전화하는 것을 잊을 수 있습니다. 예를 들어 제 3 자 프레임 워크 나 자신의 코드베이스에서 종속 된 ViewController를 서브 클래 싱하는 경우를 예로들 수 있습니다.

class PrintingViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("view has loaded") 
    } 
} 

class UserViewController: PrintingViewController { 
    override func viewDidLoad() { 
    super.viewDidLoad() 

    // do view setup here 
    } 

} 

PrintingViewController 실행할 수있는 기회를 제공하지 않을 것 여기의 viewDidLoad를 호출하지 자신의 viewDidLoad 코드

당신이 viewDidLoad 아무것도하지 않으려면 단지 돈 '

이 인위적인 예제를 가지고 그것을 구현하지 마십시오. 어쨌든 super 메서드가 호출됩니다.

+1

당신의 설명은 그것을 일반적인 방법으로 조금 더 분명하게 만들었다. 하지만이 경우에는 UIViewController에 대해 자세히 설명하고 싶습니다. 그렇게하는 것을 잊지 않도록 더 많은 시간을 잊지 말라는 것은 전통처럼 들립니다. 누군가 오래 전에 시작 했으므로 이제는 우리가 왜 그 일을 계속하는지 정확히 알지 못하지만, 우리는 여전히 그렇게합니다. 표준 UIVIewController에서 viewDidLoad를 확인하십시오 ... 비어 있습니다. 이제 빈 수퍼 메서드를 호출하는 이유는 무엇입니까? 아니면 여기서 잘못된 가정을하고 있습니까? 내 custom viewDidLoad를 구현하고 super를 호출하지 않기로 결정하면 내 앱 (any)이 잘못 작동하나요? – Andr3s4n

+0

나는 사과가 viewDidLoad의 구현을 변경하여 미묘한 방식으로 깨기 위해 슈퍼를 호출하지 않는 애플 리케이션을 만들 것이라고 생각하지 않습니다. 당신은 viewDidLoad UIViewController 빈 구현이 있다고 가정하지만 어떻게 확신 할 수 있습니까? – tsp

+3

또한, UIViewController에서 상속 받고 viewDidLoad에 대해 super를 호출하지 않는보기 컨트롤러가 있다고 가정 해 보겠습니다. 몇 달 후에 viewDidLoad에서 몇 가지 작업을 수행하는 다른 ViewController에서 상속 받기를 원한다고 결정합니다. 코드가 신비한 방식으로 깨지게됩니다. 우리는 super를 호출하지 않기 때문에 필요할 때 호출하는 것을 잊지 않고 변경시 코드를 보호하기 위해 호출합니다. – tsp

5

이는 UIViewController (모든보기 컨트롤러가 상속하는) 클래스의 viewDidLoad 구현에 따라 다릅니다. 그것이 super.viewDidLoad()을 호출하는 것보다 비어 있다면 많은 일을하지 않을 것입니다. 그러나보기 컨트롤러에 관한 몇 가지 기능이 있다면 확실히 사용하고 싶을 것입니다. 그것은 UIViewController의 구현에 관한 당신의 손에없는 때문에

당신은 항상, 우선,이 방법

2

내가 (super.viewDidLoad를 호출 생각을) 좋은 방법입니다 호출해야합니다.

iOS의 일반적인 점은 수퍼 클래스가 (속성 초기화, 배치 등) 작업을 완료 한 후에 모든 하위 클래스 설정을 수행하는 것입니다. 주변 환경을 변경하기 전에 수퍼 클래스에 모든 설정을 처리 할 기회를주지 않으면 이상한 버그와 동작이 발생할 수 있습니다.

클래스 초기화와 함께 "지정된 이니셜 라이저가 상속 된 속성에 값을 할당하기 전에 수퍼 클래스 이니셜 라이저에 위임해야합니다."와 병렬로 그릴 수 있습니다. 모든 수퍼 클래스 속성이 값을 갖고 있는지 확인하기 위해이 작업을 수행합니다.이 사실을 기반으로 하위 클래스의 상속을 통해 안전하게 사용할 수 있습니다.엄지 손가락의

규칙 :

  • 설정/초기화, 먼저 슈퍼 클래스 '구현을 실행합니다.
  • 찢어 지거나 정리할 때 수퍼 클래스의 구현을 마지막으로 실행하십시오. viewDidLoad에()는 우리가 제대로 슈퍼에서 물건을 설정하는 첫 번째) super.viewDidLoad을 (호출해야 초기화의 일종이라고 가정

.

UIViewController 기본 클래스에서 viewDidLoad() 구현을 확인하면 비어있는 것을 볼 수 있습니다. 어쩌면 당신의 자식 클래스에서 super.viewDidLoad()를 호출하는 유일한 이유는 좋은 코딩 스타일입니다 :-) 그것을 따라갈 수 있습니다!

관련 문제