2

맞아, 나는 공식적으로 혼란 스럽다. 인스턴스가 respondsToSelector 인 경우 - "인식 할 수없는 선택기가 인스턴스로 전송 된 이유가 무엇입니까?

은 10.8에 NSTableView 서브 클래스에서 호출되고 우리는 the docs 배울 수 및 헤더 NSTableViewNSDraggingSource 그래서 모두가 잘되어야합니다 구현 :

if ([super respondsToSelector:@selector(draggingSession:movedToPoint:)]) 
    [super draggingSession:session movedToPoint:screenPoint]; 

때 포함하는 방법 서브 클래스에서 draggingSession:movedToPoint:의 (재정의)가 호출되면 두 번째 줄은 사랑받는 '인스턴스로 전송 된 인식 할 수없는 선택자를 0x1054092c0'예외로 throw합니다.

누구나 하시기 바랍니다 여기에 무슨 일이 일어나고 있는지 설명해주세요! 힌트에 대한

+3

예외 중단 점을 설정하고 예제 (0x1054092c0 ')의 클래스를 확인하십시오. 또한'[super respondsToSelector : sel]'은'[self.respondsToSelector : sel]'과 동일한 * (단지'respondsToSelector :'의 슈퍼 구현을 호출한다. 셀프에서 셀렉터를 계속 체크한다). –

+0

전체 예외 메시지를 표시하십시오. –

답변

3

첫째, [super respondsToSelector:@selector(draggingSession:movedToPoint:)][self respondsToSelector:@selector(draggingSession:movedToPoint:)]과 동일합니다. super을 사용하면 주어진 메소드의 수퍼 클래스 구현을 호출 할 수 있습니다. 이 경우, respondsToSelector:. 그러나 클래스 (또는이 객체의 클래스가 무엇이든)가 -respondsToSelector:을 재정의하지 않으면 (클래스의 99.9 %는 -respondsToSelector:을 재정의 할 필요가 없습니다) 수퍼 클래스 구현은 self 클래스의 구현과 동일합니다. 기본적으로 두 경우 모두 현재 객체 (self)가 선택기에 응답하는지 확인합니다.

그래서, 당신이보고있는 것은 : self이 선택기에 응답하지만,이 클래스의 수퍼 클래스에는 선택기에 대한 구현이 없습니다. 그게 무슨 뜻 이죠? 현재 클래스이거나 현재 클래스와 현재 클래스 사이의 어느 곳에서나 self 클래스로이 메서드가 구현됩니다. 그래서 self이 그것에 응답합니다. 그러나 수퍼 클래스 구현은 없습니다.

-1

감사합니다 -
이 실제로 잘 작동 않습니다

if ([[self superclass] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)]) 
    [super draggingSession:session movedToPoint:screenPoint]; 
+0

잘못되었습니다. '[self superclass]'는 반드시이 코드가 들어있는 클래스의 수퍼 클래스 일 필요는 없습니다. 단지'self'의 클래스가이 코드가 속한 클래스 일 때만입니다.'self'의 클래스가이 클래스의 서브 클래스라면 , [self superclass]는이 클래스이거나 그 서브 클래스이기 때문에'[self superclass]'인스턴스가 응답하는지 여부를 검사하는 것만으로는 충분하지 않습니다. – newacct

+0

질문을 읽습니다 -이 코드는 동일한 하위 클래스에서 분명히 호출됩니다. 처음에 주어진 예제에서 'super'가 호출되므로이 코드는 게시 된 시나리오에 완벽하게 적용되고 문제를 해결합니다. – ATV

+0

내가 말하는 것을 잘못 읽고 있습니다.이 코드가'Foo' 클래스에 있다고 가정 해 봅시다. 그리고'푸 '의 슈퍼 클래스는'바'입니다, 알았죠? '[self class]'가 반드시'Foo'가 아니기 때문에'[self superclass]'는 반드시'Bar'가 아닙니다. – newacct

0

올바른 코드가 실제로 : newacct 지적한 바와

if ([[NSTableView class] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)]) 
    [super draggingSession:session movedToPoint:screenPoint]; 

, super이 방법이 구현되는 클래스의 슈퍼 클래스를 지칭 [self superclass] 그것이되는 인스턴스의 슈퍼 클래스 인 반면 이 클래스는 사용자 정의 클래스 (손자 : NSTableView)의 하위 클래스가 될 수 있습니다. 물론 하위 하위 클래스를 만들 가능성은 거의 없지만 올바른 작업을 수행 할 수도 있으며이 코드는 의도적으로 명확합니다.