2009-09-03 15 views
9

Diciamo che ho una classe dichiarato come:In Objective-C, come fa + alloc sapere quanta memoria allocare?

@class SomeClass 

@interface SomeClass: NSObject { 
    NSString *myString; 
    NSString *yourString; 
} 

@end 

E più tardi, in qualche altro codice dico:

SomeClass *myClass = [[SomeClass alloc] init]; 

Come si fa SomeClass sapere quanta memoria allocare dato che non ha fatto override + alloc? Presumibilmente, ha bisogno di spazio per l'ivars myString e yourString, ma usa + alloc ereditato da NSObject. C'è materiale di riferimento che copre questi dettagli?

risposta

14

+alloc è solo un metodo di classe come qualsiasi altro. L'implementazione predefinita in NSObject utilizza class_getInstanceSize() per ottenere la dimensione dell'istanza che deve essere allocata. La dimensione dell'istanza viene determinata in base a una combinazione di dimensioni della struttura temporale del tempo di compilazione per classe (senza ereditarietà) e calcolo per-runtime delle dimensioni totali della classe e di tutte le superclassi. Questo è il modo in cui iVar non fragili sono possibili a 64 bit e l'autonomia dell'iPhone.

Alcune classi, in particolare i cluster di classi, in realtà non eseguono l'allocazione di istanza vera finché non viene chiamato l'inizializzatore (motivo per cui è importante eseguire self = [super init] nei metodi di inizializzazione).

+1

Cosa sono i cluster di classe? È questo un termine Objective-C con cui dovrei essere più familiare? –

+1

NSString è un cluster di classe, ad esempio. Quando si crea un NSString, si ottiene effettivamente un'istanza di qualsiasi sottoclasse ottimizzata per gestire quel particolare tipo di stringa. – bbum

4

risolve una chiamata al runtime Objective-C, che conosce la dimensione di ogni classe.

-2

Il metodo alloc fa l'equivalente di sizeof quando va a creare un nuovo oggetto. Inoltre, le variabili di istanza myString e yourString non hanno davvero troppa memoria: sono semplicemente dei puntatori, quindi alloc assegna solo sufficiente memoria per contenere gli indirizzi.

+2

Non è così; sizeof è un'operazione di sola compilazione. Le dimensioni di allocazione sono determinate in fase di esecuzione. – bbum

+0

Sì, myString e yourString non hanno troppa memoria, ma ne hanno alcuni, ed è significativo, e deve essere assegnato da qualche parte. –

+0

myString e yourString hanno esattamente la dimensione di un puntatore in SomeClass. – bbum

Problemi correlati