2012-01-06 14 views
9

So che alloc è un metodo di classe che crea l'oggetto della classe e punta il puntatore "isa" alla classe e questo è il modo in cui i messaggi vengono mappati in fase di runtime.Come funziona l'alloc in Objective C?

e ho qualche idea su allocWithZone e zone.

Qualcuno può dirmi o puntare a un bel link che spiega: -

Come isa puntatore è puntato alla classe giusta?

Quanta memoria è allocata?

In che modo viene creata la memoria per i membri ereditati dalla classe padre?

Se id è un typedef per objc_object *, a cosa punta il puntatore isa, quindi come tiene qualsiasi oggetto perché il puntatore isa ci porterà alla tabella di distribuzione che ha selettori per i metodi ma hanno qualcosa che ci dice Quali sono i membri dei dati suppongono di essere lì?

risposta

8

Il compilatore inserisce le chiamate attraverso il runtime objc per te, dietro le quinte. È possibile trovare la libreria nel percorso di inclusione objc/. objc/runtime.h sarà probabilmente di maggior interesse. Come bonus, alcuni messaggi comuni selezionati ignorano objc_msgSend con questi inserimenti.

Come viene puntato il puntatore isa sulla classe giusta?

objc_constructInstance

la quantità di memoria allocata?

class_createInstance 
class_getInstanceSize 

Come è la memoria per i membri ereditati dalla classe genitore creati?

La memoria viene azzerata e viene impostato isa.

Se id è un typedef per objc_object *, a cosa punta il puntatore isa, quindi come mantiene anyobject perché isa pointer ci porterà alla tabella di distribuzione che ha selettori per i metodi ma hanno qualcosa che dice noi che membri di dati supponiamo essere lì?

Qualunque cosa è stata impostata durante l'inizializzazione. I puntatori agli oggetti ObjC sono solo memoria grezza. A differenza di altri linguaggi, la fusione e la conversione di tipi di scritti è un insieme diretta di indirizzo della variabile - non v'è alcun tipo di promozione esplicita o la conversione in memoria nel seguente costrutto:

MONDisplay * display = [NSString string]; 
NSLog(@"%@", display); 

il puntatore è lo stesso valore restituito da [NSString string].

+1

'id' è un tipo che rappresenta un puntatore, non un oggetto, in modo da non avere un' isa 'a sé stante. Quando dichiari una variabile di tipo 'id', significa semplicemente che puoi assegnare un puntatore a qualsiasi tipo di oggetto e il compilatore non si lamenterà di esso. L'oggetto stesso ha un membro 'isa', naturalmente, e per definizione punta alla classe di cui l'oggetto in questione è un'istanza. – Caleb