런타임시 리플렉션 호출을 통해 메소드 이름을 동적으로 복구해야합니다. 그러나 일부 사람들에게는 이상한 결과가 나타납니다.부울 인수가있는 Objective-C 메소드의 이상한 "selector mangling"
- (void)testMethod6_NSRect:(NSRect)a1 int:(int)a2 int:(int)a3 bool:(Boolean)a4 {
...
}
class_copyMethodList를 이용하여 상기 클래스 방법()을 열거하고 method_getName()을 통해 방법 선택기를 가져 오는, I 얻을 :
내 TestClass에 같은 방법이 포함
"testMethod6_NSRect:int:int:_Bool:"
을 따라서을 선택기는 "bool"에서 "_Bool"을 만들기 위해 어떻게 든 다시 작성되었습니다 (gcc?). 지금까지 내가 아직 테스트로, 이것은 "부울"선택 부분 만 할 것 같다 - 내가 int로 변경하는 경우 : 같이 (int)를 :
:- (void)testMethod1_int:(int)a1 int:(int)a2 int:(int)a3 int:(int)a4 {
...
}
내가 예상을 얻을
"testMethod1_int:int:int:int:"
Q : 누가이 "셀렉터 재 작성"을 위해 어디에서 규칙이나 포인터를 찾을 수 있습니까? 이 작업은 "bool"에 대해서만 수행됩니까? 또한이 동작이 gcc 버전, osx 버전 또는 런타임 라이브러리 버전에 의존하는지 여부를 알아야합니다. 나는 (GCC의 --version) 사용하고
: ( 는 i686-사과 darwin10-GCC-4.2.1 (GCC) 4.2.1 (애플사가 5666을 구축) (점 3)에 을 끝나면 uname -a) 10.8.0 다윈 커널 버전 10.8.0 :
#define bool _Bool
:
이 매력적이다; 나는 GCC가'bool'을보고 그것을 기본 타입의 이름으로 바꾸고 그것을 셀렉터의 일부로 인식하지 못하고 있다고 생각한다. Clang 컴파일러로 전환 해 보셨습니까? –
메서드에 _cmd를 인쇄 해보십시오. 또한 가능한 경우 llvm을 사용해야합니다. – bbum