2013-09-29 1 views
3

나는 내가조립 목적 C 클래스 ALLOC 오류

$ ./UI 
2013-09-28 22:29:31.110 UI[60688:707] *** NSForwarding: warning: selector (0x201c) for message 'alloc' does not match selector known to Objective C runtime (0x97ee8e93)-- abort 
2013-09-28 22:29:31.112 UI[60688:707] +[NSAlert alloc]: unrecognized selector sent to class 0xacb12514 
2013-09-28 22:29:31.112 UI[60688:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSAlert alloc]: unrecognized selector sent to class 0xacb12514' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x99b28e8b __raiseError + 219 
    1 libobjc.A.dylib      0x9617e52e objc_exception_throw + 230 
    2 CoreFoundation      0x99b2c8ed +[NSObject(NSObject) doesNotRecognizeSelector:] + 253 
    3 CoreFoundation      0x99a74e87 ___forwarding___ + 487 
    4 CoreFoundation      0x99a74c32 _CF_forwarding_prep_0 + 50 
    5 UI         0x00001ff1 main + 71 
) 
Trace/BPT trap: 5 

를 얻을 그것을

global _main 

extern _sizeof 
extern _printf 
extern _objc_msgSend 
extern _objc_getClass 
extern _sel_registerName 

SECTION .data 

alert_text : db "NSAlert", 0 
alloc_sel : db "alloc", 0 
init_sel : dw "init", 0 

alert_class: resb 4 

SECTION .text 
_main: 

; get the class 
sub esp, 8 
push alert_text 
call _objc_getClass 
add esp, 12 

; save class 
mov dword [alert_class], eax 

; get alloc selector 
sub esp, 8 
push alloc_sel 
call _sel_registerName 
add esp, 12 

; allocate it 
sub esp, 4 
push alloc_sel 
; push alert class 
mov eax, dword [alert_class] 
push eax 

call _objc_msgSend 
add esp, 12 

mov eax, 0 
ret 

내가 다음

$ nasm -fmacho UI.asm -o UI.o 
UI.asm:83: warning: uninitialised space declared in __data section: zeroing 
$ ld UI.o -macosx_version_min 10.8 -lSystem -framework CoreFoundation -framework AppKit -o UI 

으로 조립하여 다음 코드 (NASM)를 실행 한 왜 작동하지 않는지 알 수 없습니다. 경고 클래스를 저장하는 것과 관련이 있습니까?

+0

Mac의 설명서에서 동일한 구현이 필요하며 sel_register가 더 좋고 sel_getUid가 호환성을위한 것일 뿐이지 만 시도 할 것입니다. – Zimm3r

+0

아니요 sel_getUid로 변경하면 오류가 발생하지 않습니다. – Zimm3r

+0

불편을 끼 쳤습니다. 그게 문제가되었던 오래된 ABI. –

답변

5

내가 알 수있는 한 (셀 수없이 전문가는 아니지만) 셀렉터를 등록했지만 사용하지 마십시오.

장면 뒤에
SEL sel_registerName(const char *str); 

에서, C-string이 구금되고, (선택기의 해시 테이블에서) 새로운 포인터는 미래를 위해 사용되어야하는, 반환됩니다

sel_registerName

는 다음과 같이 선언 메소드 호출은 다음과 같습니다.

SEL alloc_sel = sel_registerName("alloc"); 
id newObject = objc_msgSend(target_class, alloc_sel); 

이 질문의 이유는 Why can't we use C-strings as SELs?을 참조하십시오.

+0

와우 덕분에 나는 (심지어 sel_registerName을 호출하고있었습니다) 스트링을 다시 밀어 넣었습니다. – Zimm3r

+0

우리 모두에게 일어날, 나는 당신을 확신합니다. –