2012-05-14 3 views
6

NSInvocation을 사용하여 하위 클래스의 수퍼 클래스 메서드를 호출하려고합니다.iOS - '수퍼'를 참조로 사용할 수 없습니까?

- (NSInvocation*) invocationWithSelector:(SEL)selector { 
    NSInvocation* call = [[NSInvocation alloc] init]; 
    [call retainArguments]; 
    call.target = super; //ERROR: use of undeclared identifier 'super' 

    call.selector = @selector(selector); 

    return call; 
} 

이 난 항상 super 거의 동일한 규칙 self로 (즉이 직접으로 처리 될 수있는 다음 있다고 가정 한대로, 나에게 조금 이상한 것 같다 관련된 코드는이 같은 간다, 비교적 간단합니다 문제의 객체에 대한 참조, 변수에 할당, 반환 값으로 사용). 이것이 실제로는 그렇지 않은 것으로 보입니다.

어쨌든, 내 NSInvocation는 슈퍼 클래스의 구현을 목표로 얻을 수있는 간단한 방법 (I 대상으로 self을 사용할 수는 서브 클래스는 슈퍼 클래스의 메소드를 오버라이드 (override) 때문에), 아니면 다른 방법을 찾기 위해 필요합니까 있는가?

+0

않습니다. (그냥 추측하면 ...) – Pochi

답변

9

자세한 내용은 What exactly is super in Objective-C?을 참조하십시오.하지만 super는 실제로 개체가 아닙니다. Super는 컴파일러가 obj-c 런타임 호출 (특히 objc_msgSendSuper)을 생성하기위한 키워드입니다. 기본적으로 메시지를 보내기 전에 클래스를 슈퍼 클래스로 캐스팅하는 것과 같습니다.

EDIT 따라서 호출하려는 메서드를 재정의 한 경우 [super method]를 직접 호출하고 대신 해당 메서드를 호출하도록 호출을 설정해야합니다. 런타임은 객체에게만 메시지를 보내고 그것들을 구현하는 상속 체인의 가장 낮은 멤버에서 처리됩니다.

+0

흥미롭게도, 본질적으로 서브 클래스가 타겟 메소드의 자체 구현을 제공하는 경우'NSInvocation' 또는'performSelector ... '를 사용하여 간접적으로 수퍼 클래스 메소드를 호출 할 수 없습니까? 그것은 약간의 제한처럼 보입니다. – aroth

+0

? C++ 또는 다른 C 기반 언어로이 작업을 수행 할 수 있습니까? 내 말은, 당신이 기능을 오버라이드한다면 그것은 부모 클래스의 행동 (또는 부모 클래스의 행동 이외에)과 다른 행동을 당신의 클래스에서 원한다는 것을 의미한다. 이것이 올바른 생각이 아니라면 OOP에 대한 나의 이해에 근본적인 결함이 있다고 생각합니다. – borrrden

+0

아니요, 다른 언어에서 허용하는 것으로 보이지 않습니다 (Java로 시도한 경우, 동일한 문제). 그러나 당신은 당신의 "부모 클래스에 덧붙여서 _"덧글로 핵심 포인트를 쳤다. 서브 클래스에는, 오버라이드 (override) 된 메소드의 슈퍼 클래스 구현을 명시 적으로 호출하는 기능이 있습니다. 그리고 그것 때문에'NSInvocation'이나'performSelector ...'호출을 사용하여 암묵적으로 같은 일을 할 수 없어야하는 논리적 인 이유는 없습니다. 즉, 수퍼 클래스 구현 호출이 명시 적/즉각적인 호출을 요구하는 것이 적절하지 않다고 생각합니다. – aroth

1

superself 그래서 그냥 그들 사이의 차이는 당신이 슈퍼 클래스를 호출 할 수 있도록하는 방법으로 self에 메시지의 수신기로 super를 사용할 수 있다는 것입니다

call.target = self; 

사용하여 같은 객체 구현.

+0

"self"를 입력 하시겠습니까? – borrrden