2010-06-30 16 views
9

He leído una serie de fragmentos que mencionan que nunca se debe usar la notación de puntos dentro de los métodos init o dealloc. Sin embargo, parece que nunca puedo descubrir por qué. Una publicación mencionó de paso que tiene que ver con KVO, pero no más.Objective-C Dot Sintaxis e Init

@interface MyClass : NSObject { 
    SomeObject *object_; 
} 
@property (nonatomic, retain) SomeObject *object; 
@end 

¿Esta implementación es mala?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     self.object = object; 
    } 

    return self; 
} 
@end 

¿Pero esto es bueno?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     object_ = [object retain]; 
    } 

    return self; 
} 
@end 

¿Cuáles son las dificultades de usar notación de puntos dentro de su init?

+0

Parece que en el segundo ejemplo debe escribir object_ = [object retain]; – Vladimir

+0

corregido, el problema con ejemplos escritos rápidamente. ;) – MarkPowell

Respuesta

25

En primer lugar, no es la notación de puntos específicamente, son los accesos que no debe usar.

self.foo = bar; 

es idéntica a

[self setFoo: bar]; 

y ambos están mal visto dentro de init/dealloc.

La razón principal es porque una subclase puede anular los accesos y hacer algo diferente. Los accesadores de la subclase pueden asumir un objeto completamente inicializado, es decir, que se haya ejecutado todo el código en el método init de la subclase. De hecho, nada de eso tiene cuando se está ejecutando su método init. De forma similar, los accesadores de la subclase pueden depender del método dealloc de la subclase que no se haya ejecutado. Esto es claramente falso cuando se ejecuta su método dealloc.

+0

¿Quienquiera que haya votado esta respuesta por favor explique por qué lo hizo? – JeremyP

1

Las razones que he escuchado surgen principalmente cuando escribe sus propios setters/getters. Al usar las versiones @synthesized predeterminadas de los métodos, no causará mucho problema. Sin embargo, cuando escribes tu propio setter, generalmente tendrá un efecto secundario en tu clase. Este efecto secundario probablemente no se desee en el init, o incluso va a causar problemas si hace referencia a otros ivars que aún no se han creado. El mismo problema en el trato, si tiene un efecto secundario, tiene potencial para estallar.