2011-12-19 11 views
26

Antes de la ARC, si quería una propiedad a ser de sólo lectura a usarlo, sino que tenga permisos de escritura dentro de la clase, lo que podía hacer:Objective-C ARC propiedades de sólo lectura y aplicación colocador privada

// Public declaration 
@interface SomeClass : NSObject 
    @property (nonatomic, retain, readonly) NSString *myProperty; 
@end 

// private interface declaration 
@interface SomeClass() 
- (void)setMyProperty:(NSString *)newValue; 
@end 

@implementation SomeClass 

- (void)setMyProperty:(NSString *)newValue 
{ 
    if (myProperty != newValue) { 
     [myProperty release]; 
     myProperty = [newValue retain]; 
    } 
} 
- (void)doSomethingPrivate 
{ 
    [self setMyProperty:@"some value that only this class can set"]; 
} 
@end 

Con ARC, si quisiera anular setMyProperty, ya no puede usar palabras clave de retención/liberación, ¿es esto correcto y correcto?

// interface declaration: 
@property (nonatomic, strong, readonly) NSString *myProperty; 

// Setter override 
- (void)setMyProperty:(NSString *)newValue 
{ 
    if (myProperty != newValue) { 
     myProperty = newValue; 
    } 
} 

Respuesta

62

Sí, eso es adecuado, pero ni siquiera necesita tanto.

Usted puede hacer

- (void)setMyProperty:(NSString *)newValue 
{ 
     myProperty = newValue; 
} 

El compilador va a hacer lo correcto.

La otra cosa es que ni siquiera necesitas ESO. En su extensión de clase, en realidad puede volver a especificar las declaraciones @property.

@interface SomeClass : NSObject 
@property (nonatomic, readonly, strong) NSString *myProperty; 
@end 

@interface SomeClass() 
@property (nonatomic, readwrite, strong) NSString *myProperty; 
@end 

Hacer eso, sólo tiene que sintetizar y tiene una incubadora privada que se sintetiza para usted.

+1

Gracias Joshua - muy útil! He estado, desde entonces, desconcertando una última cosa. Al leer acerca de los cambios de ARC en las propiedades [aquí] (http://tools.ietf.org/html/draft-pantos-http-live-streaming-08) parece que, de forma predeterminada, están implementados por @synthesize con ** fuerte ** en lugar de ** asignar **. En ese caso, con el objetivo de hacer que la API pública sea más limpia, no es mejor especificarla (no atómica, de solo lectura) ya que no es necesario que los usuarios de la interfaz pública se preocupen o necesiten saber que, internamente, la propiedad es sólida. ? Espero tener sentido aquí. :) –

+0

Es fuerte solo para los tipos de objeto, para ayudar a que las cosas sean más explícitas. Me gusta poner 'strong',' weak' o 'assign'. –

+0

Indeed strong solo se aplica a los tipos de objetos, pero aún queda la pregunta de si su API pública (es decir, el archivo de encabezado) debería publicar este detalle. ¡Ese es el verdadero punto que estaba interrogando! –

6

Puede redeclare su propiedad como readwrite en la extensión de la interfaz:

@interface SomeClass() 
@property (nonatomic, strong, readwrite) NSString *myProperty; 
@end 
Cuestiones relacionadas