2013-02-03 1 views
3

런타임시 리플렉션 호출을 통해 메소드 이름을 동적으로 복구해야합니다. 그러나 일부 사람들에게는 이상한 결과가 나타납니다.부울 인수가있는 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 

:

+0

이 매력적이다; 나는 GCC가'bool'을보고 그것을 기본 타입의 이름으로 바꾸고 그것을 셀렉터의 일부로 인식하지 못하고 있다고 생각한다. Clang 컴파일러로 전환 해 보셨습니까? –

+1

메서드에 _cmd를 인쇄 해보십시오. 또한 가능한 경우 llvm을 사용해야합니다. – bbum

답변

4

문제는 C99 표준 헤더 <stdbool.h>에 처리기 마법의 추한 부분에 자리 잡고의 BOOL를 사용해보십시오 C99는 0이라는 형식을 정의합니다.은 C++의 bool 유형과 유사합니다. 이 정의는 C에서 사용할 수 있지만 C++ 식별자로 사용할 수 있습니다.

솔루션 :

#undef bool 
+0

감사합니다 - 그게 문제입니다; 비록 내가 선택기 - 부품을 전처리기를 통해 번역 할 수 있도록 gcc 버그라고 생각한다. 전체 셀렉터와 반대로 ... 하지만로드 (이진) 클래스를 제어 할 수는 없기 때문에 이미 컴파일 된 클래스에서 이런 일이 발생했다고 가정합니다. (다른 여러 가지 잘못된 번역이 이미 바이너리로 바뀌 었는지 궁금합니다 ...) – blabla999

+0

이것은 모든 (해당되는) cpp 구현과 관련된 문제입니다 C 전처리 기) : 전처리 기는 언어를 이해하지 못합니다. 당신이 기대하는대로하지 않는 다른 사례를 쉽게 찾을 수 있습니다. 그래서, 아니, 그것은 버그가 아니지만 예상하고 행동에 의존. 그럼에도 불구하고 성가신. –

+0

예, typedef가 있어야합니다 ... – blabla999

0

대신 부울

+0

같은 동작입니다. 이것은 인수 유형이 아닌 선택자의 기능인 것 같습니다. 또한 내가 반영해야 할 코드를 제어 할 수 없기 때문에 그러한 이름을 가진 메소드가 발생하는 것을 막을 수는 없습니다 (즉, 그것이 차이를 만들었지 만, 그것은 일반적인 해결책으로 보이지 않습니다. 내 문제) ... – blabla999

관련 문제