2009-09-03 16 views
9

Digamos que tengo una clase declara como:En Objective-C, ¿cómo sabe + alloc cuánta memoria asignar?

@class SomeClass 

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

@end 

Y después, en algún otro código digo:

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

¿Cómo sabe SomeClass la cantidad de memoria para asignar dado que no lo hizo anular + alloc? Presumiblemente necesita almacenamiento para los ivars myString y yourString, pero está usando + alloc heredado de NSObject. ¿Hay material de referencia que cubra estos detalles?

Respuesta

14

+alloc es sólo un método de clase como cualquier otro. La implementación predeterminada en NSObject usa class_getInstanceSize() para obtener el tamaño de instancia que se debe asignar. El tamaño de la instancia se determina en función de una combinación de tamaño de estructura de tiempo de compilación por clase (sin herencia) y cálculo por tiempo de ejecución del tamaño total de la clase y todas las superclases. Así es como los iVars no frágiles son posibles en 64 bits y en los tiempos de ejecución del iPhone.

Algunas clases, los grupos de clases en particular, no hacen la verdadera asignación de instancia hasta que se llama al inicializador (por eso es importante hacer self = [super init] en sus métodos de inicialización).

+1

¿Qué son los grupos de clases? ¿Es este un término de Objective-C con el que debería estar más familiarizado? –

+1

NSString es un clúster de clase, por ejemplo. Cuando crea un NSString, en realidad obtiene una instancia de cualquier subclase optimizada para manejar ese tipo particular de cadena. – bbum

4

+[NSObject alloc] remite a una llamada al tiempo de ejecución de Objective-C, que no conoce el tamaño de cada clase.

-2

El método alloc hace el equivalente a sizeof cuando va a crear un nuevo objeto. Además, las variables myString y yourString ejemplo, en realidad no tienen demasiado almacenamiento: no son más punteros, por lo alloc simplemente asigna suficiente memoria para almacenar las direcciones.

+2

No lo hace; sizeof es una operación de solo tiempo de compilación. El tamaño de asignación se determina en tiempo de ejecución. – bbum

+0

Sí, miCadena y SuCadena NO tiene demasiado almacenamiento, pero tienen algunos, y es importante, y tiene que ser asignado a alguna parte. –

+0

myString y yourString son exactamente del tamaño de un puntero en SomeClass. – bbum

Cuestiones relacionadas