Questo è un estratto da Objective-C runtime programming guide
:intesa Objective-C runtime
Quando viene creato un nuovo oggetto, memoria per essa è allocata, e le sue variabili di istanza vengono inizializzate. Il primo tra le variabili dell'oggetto è un puntatore alla sua struttura di classe. Questo puntatore, chiamato isa, fornisce all'oggetto l'accesso alla sua classe e, attraverso la classe, a tutte le classi da cui eredita.
isa è dichiarata in NSObject
come questo:
Class isa;
A sua volta Class
è niente di più che un puntatore alla struct
typedef struct objc_class *Class;
E ora diamo un'occhiata a questa struttura:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}
Possiamo vedere che il puntatore alla super classe (così come tutti gli altri membri della struct eccetto un altro isa) non è disponibile nell'ultima versione di Objective-C.
Quindi la mia domanda è come un oggetto può accedere alla sua superclasse se il puntatore super_class
non è disponibile? Ha accesso alla superclasse attraverso questo un altro puntatore isa? Ma come succede esattamente? Come funziona? Qualcuno può spiegarlo?
Dove hai trovato quella definizione? Questo file di intestazione ne mostra uno diverso: http://www.opensource.apple.com/source/objc4/objc4-208/runtime/objc-class.h – trojanfoe
l'ho trovato in objc/runtime.h –
dipende dal versione di runtime penso che –