2010-05-24 7 views
3

클래스 메서드에서 선택기를 작성하려고합니다.클래스 메서드를 선택기 문제로 전달

것은 나는 이런 식으로 일을 해요 :

NavigationTreeActionHandler* handler=[NavigationTreeActionHandler self]; 
NavigationTreeNode* bombsNode=new NavigationTreeNode("Bombs","bigbomb.tif" 
    ,handler,@selector(BigBombButtonPressed:)); 

나는 대상과 대상 방법에 대한 선택을 NavigationTreeNode을 통과해야합니다. 클래스 개체의 self 속성을 사용하여 대상을 얻으려고합니다. htis가 올바른 방법인지 모릅니다. 그런 다음 클래스에서 호출 할 클래스 메서드에 대한 선택기를 가져옵니다.

모든 확인 컴파일하지만 사용할 때 그것은 실패

[[handler class] instanceMethodSignatureForSelector:selector];

내가이 전무를 얻을 수 및 이유를 정말 모르겠다 ... 수 사람의 도움이 될까요?

+0

'[NavigationTreeActionHandler self]'를 쓰려면 우선 [[NavigationTreeActionHandler class]'를 쓰는 것이 좋지만 차이를 만들어서는 안됩니다 – user102008

답변

3

몇 가지 제안 :

  • [NavigationTreeActionHandler self] 클래스 개체를 얻을 잘 작동하지만, 그 유형

  • 인스턴스에 대한 참조 아니기 때문에 내가 입력 id 대신 NavigationTreeActionHandler*handler를 선언 할 것
  • [handler class]은 중복됩니다. handler은 이미 클래스 객체입니다.

  • instanceMethodSignatureForSelector:handlerselector을 구현하지 않는 경우에만 nil을 반환합니다. 철자 검사 등을 확인하고 NSLog를 던져서 수신중인 것을 확인하십시오.

    NSLog ("handler = % @ sel = % @", handler, NSStringFromSelector (selector));

하지만 처음에는 instanceMethodSignatureForSelector:으로 무엇을하려하는지 명확하지 않습니다. 클래스 메소드를 호출하려는 경우 [handler performSelector:selector]; 원하는 것을 수행하지 않습니까?

1

class 메서드를 호출하면 개체 클래스가 생성되고 [[handler class] instanceMethodSignatureForSelector:selector]을 사용하여 개체 handler의 선택기에 대한 메서드 서명을 가져 오는 것으로 가정합니다. class 객체 +class이 인스턴스 메소드 -class을 덮어 쓰기 때문에 클래스 객체에 대해 class 메소드의 의미가 다르기 때문에 정상 객체에 대해서는 작동하지 않지만 대신 +class은 호출 된 객체를 반환합니다. 클래스의 인스턴스 (메타 클래스)입니다. 이 훨씬 짧은

[handler methodSignatureForSelector:selector] 

:

이 솔루션은 그 방법 서명을 얻을 인스턴스에서 호출 할 수있는 방법이있는 한 당신도, 모든 클래스를 얻을 필요가 없다는 것입니다 의도 된 것을 수행하는보다 쉬운 방법이며, 클래스 오브젝트에도 적용됩니다.