2011-01-24 11 views
0

我與Objective-C的運行時間玩,讓試圖打印對象的描述,當SIGSEGV SIGSEGV:Objective-C運行於descrption

#include <objc/runtime.h> 
#include <stdio.h> 
#include <stdlib.h> 


int 
main() 
{ 
    // SEL sAlloc = sel_registerName("alloc"); 
    SEL sInit = sel_registerName("init"); 
    SEL sDesc = sel_registerName("description"); 
    id desc; 
    Class nAuto = (Class)objc_getClass("NSAutoreleasePool"); 
    Class nObject = (Class)objc_getClass("NSObject"); 

    // Avoid __NSAutoreleaseNoPool warrning 
    id nsAuto = class_createInstance(nAuto, 0); 
    objc_msgSend(nsAuto, sInit); 

    id ns = class_createInstance(nObject, 0); 
    objc_msgSend(ns, sInit); 

    desc = objc_msgSend(ns, sDesc); 
    printf("%s\n", class_getName(ns->isa)); 
    printf("%s\n", class_getName(desc->isa)); // SIGSEGV triggered 
    NSLog(desc); 


    return EXIT_SUCCESS; 
} 

因此,如果任何人有一個想法,爲什麼這種情況正在發生。由於

+0

`objc_msgSend`有一個解釋。在調用之後,有一個cltq指令,該指令將eax寄存器擴展爲rax。所以我只是想知道爲什麼`objc_msgSend`被聲明返回一個32位指針? – mathk 2011-01-24 15:21:50

回答

0

objc_msgSend必須強制使用前:不知何故在看近的彙編代碼

desc = (IMP)objc_msgSend(ns, sDesc);