2010-11-12 7 views
16

¿Por qué este esquema de inicialización de propiedad común no se arriesga cuando el setter sintetizado intenta liberar el objeto myArray indefinido? ¿O los objetos de propiedad se inicializan automáticamente a cero y no necesito hacer esto en absoluto?Sintaxis correcta para el método init de Objective-C

@interface myClass : NSObject { 
    NSArray* myArray; 
} 
@property (nonatomic, retain) NSArray* myArray; 
@end 

@implementation myClass 
@synthesize myArray; 
-(id)init { 
    if (self = [super init]) { 
     self.myArray = nil; 
    } 
    return self; 
} 

... 

Respuesta

12

Como han indicado otros, la variable de instancia ya está inicializada en nil.

Además, as per Apple's documentation, las variables de instancia se deben establecer directamente en un método init, ya que los métodos getter/setter de una clase (o subclase del mismo) pueden basarse en una instancia completamente inicializada.

+0

Gracias por una respuesta informativa rápida y extra. – eclux

+0

"como los métodos getter/setter de una clase (o subclase de la misma) pueden basarse en una instancia completamente inicializada" ¿tiene la fuente de esto? ¡Gracias! –

+0

Ciertamente, sí, está en los documentos de Apple. Editaré mi respuesta para incluir una referencia. – paulbailey

3

Ya se ha inicializado en nil.

25

Las variables de instancia de objeto en Objective-C se inicializan a nil de manera predeterminada. Además, se permite la mensajería nil (a diferencia de llamar a un método en null en lenguajes de llamadas a funciones como Java, C# o C++). El resultado de un mensaje al nil es nil, esta llamada [nil release]; es solo nil, no es una excepción.

En una nota lateral, es la mejor práctica para asignar/llamar a las variables de instancia directamente en -init y -dealloc métodos:

-(id)init { 
    if (self = [super init]) { 
     myArray = nil; 
    } 
    return self; 
} 

- (void)dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 
Cuestiones relacionadas