iphone - ¿Las variables de instancia están establecidas en nulo por defecto en Objective-C?
cocoa cocoa-touch (3)
Estoy solucionando algunos problemas de memoria con mi aplicación de iPhone y he estado pensando en algunos conceptos básicos. Si configuro un ivar y nunca termino usándolo en la vida útil de mi objeto, cuando llamo a dealloc, ¿eso causará un problema? P.ej
@interface testClass {
id myobject;
}
@property (nonatomic, retain) id myobject;
@end
@implementation testClass
@synthesize myobject;
- (id)init {
...
// Do I have to set myobject to nil here?
// So if myobject isn''t used the dealloc call to nil
// will be okay? Or can you release the variable without
// having set every object to nil that you may may not use
...
}
...
// Somewhere in the code, myobject may be set to
// an instance of an object via self.myobject = [AnObject grabAnObject]
// but the object may be left alone
...
- (void)dealloc {
[myobject release];
[super dealloc];
}
@end
Encuentro que es una buena práctica establecer siempre esos ivars en nil
en el método init
. De esta manera, está absolutamente seguro de que su llamada a la release
en el destructor no puede causar problemas.
Si resulta que Objective-C los establece automáticamente en nil
, y por alguna razón se encuentra con un cuello de botella de velocidad que puede mejorarse eliminando esas asignaciones (muy poco probable), entonces puede preocuparse por eliminarlas. Mientras tanto, nil
a nil
y duerme más fácil :)
actualización: BJ Homer y Chuck han señalado que los ivars se establecerán automáticamente en cero, por lo que ahora se trata de una decisión sobre el estilo.
Las variables de instancia se inicializan en 0 antes de que se ejecute su inicializador.
Sí, los ivars siempre se inicializan a 0 / nil / NULL / NO / etc.
Sin embargo, si te ayuda a entender lo que está pasando, ve por ello. El impacto en el rendimiento es insignificante. No necesita hacerlo, pero no causará ningún problema si lo hace.