2011-08-30 4 views
2

재정의 된 메서드를 호출해야하는지 또는 필요하지 않은지 이해할 수 없습니다.재정의 된 메서드를 호출해야하는지 또는 필요하지 않은지 이해할 수 없습니다.

예를 들어, 할당 해제의 것이 .. 초기화도 같아요 들어

-(void) dealloc 
{ 
    ... 
    [super dealloc]; 
} 

필요가 viewWillAppear에 대한

-(void) init 
{ 
    [super init]; 
    .. 
} 

무엇

? 그리고 전에 super 메소드를 호출해야합니까?

(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
} 

감사

답변

2

오버라이드 된 메서드에서 super을 호출해야하는지 여부를 확실히 알 수있는 유일한 방법은 해당 메서드에 대한 설명서를 읽는 것입니다. 당신이 준 예를 들어

: init : The documentation 상태 : 초기화의

서브 클래스 버전은 슈퍼에 메시지를 통해, 그들이 상속 클래스의 초기화 코드 을 통합해야합니다 ... super에 대한 메시지는 메소드에 이 추가 된 초기화 코드 앞에옵니다. 이 시퀀싱은 초기화가 에서 상속의 순서로 진행되도록합니다.

dealloc

: The documentation 상태 :

서브 클래스는 데이터 객체와 같은 동적으로 할당 된 저장 소비하는 추가 메모리의 방출을 허용하거나 객체 인스턴스에 할당 해제의 자신의 버전을 구현해야합니다 할당 해제 된 객체가 소유 한 변수 클래스 별 해제를 수행 한 후, 서브 클래스 방법은 슈퍼에 메시지를 통해 할당 해제의 슈퍼 클래스 버전을 포함한다 :

viewWillAppear:The documentation 상태 : 당신은 사용자 지정 작업을 수행하기 위해이 메소드를 오버라이드 (override) 할 수

보기를 표시하는 과 관련된.
... 이 메서드를 재정의하는 경우 구현시 어느 지점에서 super 메서드를 호출해야합니다.

모든 방법이 다릅니다. viewDidAppear:을 무시하면 이어야합니다. loadView을 무시하면 이 아니어야합니다. 기본적으로 메서드를 재정의 할 때마다 해당 메서드에 대한 설명서를 확인하여 super를 호출해야하는지 여부를 확인해야합니다. 그렇다면 자신의 구현 전후에 super를 호출해야하는지 여부를 확인해야합니다.

설명서에 문제가없는 경우 귀하에게 달려 있습니다. 저자의 누락에 대한 저자를 처음으로 꾸짖고 나서, 당신이 생각하는대로 말하십시오. 나는 일반적으로 이 아닌데 문서가 어떤 식 으로든 말하지 않으면이 super를 호출하지 않을 것입니다.

1

나는 당신의 슈퍼 초기화 먼저 이동하고 슈퍼 dealloc을 마지막으로 이동하는 것이 좋습니다 말할 것입니다. 부모 함수에 액세스하여 액세스 권한을 상실하기 만하면됩니다.

viewWillAppear와 같은 메소드의 경우 실제로 시도 할 대상에 따라 달라집니다. 하지만 super 메소드를 먼저 호출하는 것이 가장 좋습니다. super 메소드가 자신의 viewWillAppear 메소드에서 수행하려고 시도하는 것을 무효화 할 가능성이 있기 때문입니다.

0

글쎄, 그것은 수퍼 클래스의 메소드를 호출 할 것인지 아닌지에 달려있다.

전혀 호출하지 않으면 수행중인 작업을 알고 있는지 확인하십시오. 수퍼 클래스의 메소드가 실행할 코드의 일부를 대체해야 할 수도 있습니다. 그러나 드문 경우지만 그럴만한 이유가있을 수 있습니다.

dealloc의 경우 시퀀스가 ​​중요하지 않습니다.

init의 경우 다소 중요합니다. 대부분의 경우 코드는 [super init]을 호출 한 다음에 와야합니다. 특히 수퍼 클래스의 메서드를 직접 사용하거나 수퍼 클래스의 속성에서 읽으려는 경우 코드를 따라야합니다. 그러나 여기에는 몇 가지 예외가 적용될 수 있습니다.

for viewWillAppear 저는 Chase 단어를 사용하고 있습니다. viewDidLoad 등에도 동일하게 적용됩니다.

일반적으로 몇 가지 상식을 적용하면됩니다. 수퍼 클래스의 방법이 무엇이며 어떻게 바뀔지 생각해보십시오.

+3

dealloc의 경우 시퀀스가 ​​중요합니다. '[super dealloc]'은 당신이 마지막으로 호출 한 것이어야한다. 왜냐하면 객체의 메모리를 해제하는'[NSObject dealloc]'까지 버블 링 될 것이기 때문이다. '[super dealloc] '을 호출 한 후에 ivar에 접근하려는 시도는 충돌을 야기 할 수 있습니다. –

관련 문제