objective-c - tutorial - objective c vs c++
¿Qué significa isa en objetivo-c? (2)
Cuando los objetos son asignados por el tiempo de ejecución de Objective-C, toda la memoria donde residen las variables de instancia se pone a cero para que no haya necesidad de establecer variables de instancia en 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
significa "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.
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.
Inicialización
No inicialice las variables a 0 o nil en el método init; es redundanteToda la memoria para un objeto recién asignado se inicializa a 0 (excepto para isa), por lo que no satura el método init reinicializando las variables a 0 o nil.
Bajo el capó, los objetos de Objective-C son básicamente estructuras 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 C como int
) o nil
(para objetos Objective-C). Las directrices de Apple dicen que inicializar tus ivars a esos valores en tus métodos init
es redundante, así que no lo hagas. Por ejemplo, supongamos que tienes una clase como esta:
@interface MyClass : NSObject
{
int myInt;
double myDouble;
MyOtherClass *myObj;
}
@end
Escribir su método init
esta manera sería redundante, ya que esos ivars se inicializarán en 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 se inicialicen a valores distintos de 0
o nil
, aún debe inicializarlos:
@implementation MyClass
- (id)init
{
if ((self = [super init])) {
myInit = 10;
myDouble = 100.0;
myObj = [[MyOtherClass alloc] init];
}
return self;
}
@end