2010-07-09 2 views
0

아는 전부입니다. Objective-c를 사용하면 메서드 호출을 수퍼 클래스로 전달할 수 있습니다. [super method] 그러나 앞으로 호출을 전달하려고합니다. super.super; 즉시 상위 클래스를 건너 뜁니다.Objective-C에서 특정 수퍼 클래스에 메서드를 전달할 수있는 방법

우리는 쉽게 타입 캐스팅 ((GrandSuper *) 객체) .method()를 통해이를 수행 할 수 있습니다.

객관적인 C에서 동일한 작업을 수행하기 위해 자신의 조항인가 난 당신이 use objc_msgSendSuper directly에 필요가 있다고 생각

+4

첫 번째를 질문은 왜 그런가? ObjC에서 그렇게해야하는 경우 디자인 문제가 발생할 가능성이 큽니다. –

+2

C++에서는 타입 캐스팅을 피하고이를 대신 사용하는 것이 더 안전합니다.'object.GrandSuper :: method()' –

+0

가장 좋은 방법은 객체 모델을 재 설계하여이를 수행 할 필요가 없도록하는 것입니다. – JeremyP

답변

3

이 가능하지만 그것은 아마 이렇게 나쁜 생각입니다. 당신은 당신이하고자하는 것을 달성하기위한 더 좋은 방법을 생각하고 싶을 것입니다.

에서 상속받은 Mammal을 상속 한 Cat 클래스가 있다고 가정 해 보겠습니다. 당신이 방법 -[Cat makeNoise]에있는 경우

, 당신은 -[Mammal makeNoise]를 건너 뛰고과 같이 -[Animal makeNoise]를 호출 할 수

-(void) makeNoise; 
{ 
    void(*animalMakeNoiseImp)(id,SEL) = [Animal instanceMethodForSelector:@selector(makeNoise)]; 
    animalMakeNoiseImp(self, _cmd); 
} 
+0

고마워, 나는 단지 빠른 수정을 원했다. – shakthi

3

, 즉

#include <objc/message.h> 
... 

struct objc_super theSuper = {self, [GrandSuper class]}; 
id res = objc_msgSendSuper(&theSuper, @selector(method)); 
+0

선택기가 구조체를 반환하면주의하십시오. 'objc_msgSendSuper' 또는'objc_msgSendSuper_stret'를 사용할지를 결정해야하는데, 이는 항상 간단하지는 않습니다. –

0

을 당신도 바로 슈퍼의 슈퍼 호출 할 수 있습니다 생각 :

[[[self super] super]functionOfInterest]; 
관련 문제