Domanda

So che Objective-C utilizza dinamica vincolante per tutte le chiamate di metodo. Come è implementato? Fa Objective-C "si trasformano in codice C" prima della compilazione e basta usare (void *) puntatori per tutto?

È stato utile?

Soluzione

Concettualmente, ciò che sta accadendo è che c'è una biblioteca dispatcher (comunemente indicato come il runtime Objective C), e il compilatore converte qualcosa di simile:

[myObject myMethodWithArg:a andArg:b ];

in

//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);

E poi le offerte di runtime con tutta la rilegatura e la spedizione, trova una funzione appropriata, e lo chiama con quegli argomenti. Semplificando si può pensare ad esso come una sorta di ricerca hash; naturalmente è molto più complicato che poi nella realtà.

Ci sono molte più questioni relative a cose come metodo di firme (C non codifica i tipi in modo che il tempo di esecuzione ha bisogno di trattare con esso).

Altri suggerimenti

Ogni metodo Objective C è implementato "sotto il cofano" come (in effetti) una funzione C. Il metodo ha un messaggio (stringa di testo) ad esso associati, e la classe ha una tabella di ricerca che corrisponde alla stringa messaggio con la funzione C. Così, quando si chiama un metodo di Objective C, ciò che realmente accade è che si invia una stringa di messaggio per l'oggetto e l'oggetto appare la funzione C associata nella tabella di metodo di ricerca della sua classe e corre questo.

C'è di più ad esso con Objective C, come come oggetti gestire i messaggi che non capiscono inoltrando loro, come cache di lookup messaggio-to-metodo, e così via, ma questo è i principi fondamentali.

C ++ è simile, tranne che al posto della classe avere una tabella dei messaggi, è qualcos'altro chiamato "vtable", e si invoca un metodo non tramite una stringa di testo, ma attraverso il suo offset nel vtable. Questa è una forma di binding statico e accelera esecuzione piuttosto, ma è meno flessibile legame dinamico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top