2010-08-04 22 views
37

Me gustaría saber el significado de las siguientes líneas escritas con un ejemplo. No puedo entender qué significan realmente las líneas. Las líneas son de las pautas de codificación objetivo-c de google.¿Qué significa isa en objetivo-c?

inicialización
no inicializan las variables a 0 o nulo en el método init; es redundante

Toda la memoria para un objeto recientemente asignado se inicializa a 0 (excepto para isa), por lo que no complica el método init reinicializando las variables a 0 o nil.

Respuesta

82

Bajo el capó, los objetos de Objective-C son básicamente estructuras en C. Cada uno contiene un campo llamado isa, que es un puntero a la clase que el objeto es una instancia de (así es como el objeto y el tiempo de ejecución de Objective-C saben qué tipo de objeto es).

En cuanto a la inicialización de variables: en Objective-C, las variables de instancia se inicializan automáticamente a 0 (para tipos de C como int) o nil (para objetos Objective-C). Las pautas de Apple dicen que inicializar tus ivars a esos valores en tus métodos init es redundante, así que no lo hagas. Por ejemplo, decir que tenía una clase como esta:

@interface MyClass : NSObject 
{ 
    int myInt; 
    double myDouble; 
    MyOtherClass *myObj; 
} 
@end 

la escritura de su método init esta manera sería redundante, ya que esos Ivars serán inicializados a 0 o nil todos modos:

@implementation MyClass 

- (id)init 
{ 
    if ((self = [super init])) { 
     myInt = 0; 
     myDouble = 0.0; 
     myObj = nil; 
    } 
    return self; 
} 

@end 

Usted puede hacer esto en su lugar:

@implementation MyClass 

- (id)init 
{ 
    return [super init]; 
} 

@end 

Por supuesto, si desea que los ivars a ser inicializado a los valores distintos de 0 o nil, aún debe inicializarlas:

@implementation MyClass 

- (id)init 
{ 
    if ((self = [super init])) { 
     myInit = 10; 
     myDouble = 100.0; 
     myObj = [[MyOtherClass alloc] init]; 
    } 
    return self; 
} 

@end 
+1

Gracias por la respuesta me gustaría saber acerca de esta línea. No inicialice las variables a 0 o nil en el método init; es redundante ¿Dónde deberíamos usar este patrón? ¿Significa que no debemos inicializar las variables en los datos Modal's –

+2

? Siéntase libre de inicializar sus datos; simplemente no inicialice sus variables a '0' o' nil'. – sarnold

+0

básicamente lo explicó sarnold, pero actualicé mi respuesta para abordar este problema. – mipadi

29

Cuando los objetos son asignados por el tiempo de ejecución de Objective-C, toda la memoria, donde las variables de instancia residen se pone a cero hacia fuera para usted, así que no hay necesidad de ajustar las variables de instancia de 0 o nil. Puede establecerlos en cualquier valor que desee. Algunos desarrolladores incluso ignoran la redundancia y establecen variables de instancia en 0 de todos modos solo para fines explícitos o descriptivos.

isa medios “ es un ”. Cada objeto Objective-C (incluidas todas las clases) tiene un puntero isa. El tiempo de ejecución sigue este puntero para determinar qué clase es un objeto, por lo que sabe a qué selectores responde el objeto, cuál es su superclase, qué propiedades tiene el objeto, etc.