2011-07-08 11 views
8

En Objective-C, hay un tipo de camino hacker para crear métodos privados, en el archivo .m:Creación de propiedades privadas en Objective-C

@interface FooClass (PrivateMethods) 
- (void) doBar:(id)barAction withBaz:(id)bazAction; 
@end 

Esto funciona muy bien para los métodos. Traté de hacer lo mismo con una propiedad:

@interface BarClass (PrivateMethods) 
@property (nonatomic, strong) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 

Esto provocó una advertencia de compilación: Propiedad declarado en la categoría '' PrivateMethods no pueden ser implementadas en implementación de la clase. Traté de mover mi propiedad a una categoría:

@implementation BarClass (PrivateMethods) 
@synthesize myBaz = _myBaz; 
@end 

continuación: @synthesize is not allowed in a category's implementation.

La respuesta obvia es "dejar de tratar, sólo tiene que utilizar Ivars", pero me han dicho por la gente en Apple que' ve (personalmente) movido a usar propiedades por completo. La seguridad que traen (como la seguridad en un arma, más difícil de tirarse en el pie) me hace feliz por dentro, así que ¿hay alguna forma de hacer esto sin recurrir a ivars desnudos?

Respuesta

16

Utilice un class extension en lugar de una categoría (nótese la ausencia de un nombre de categoría dentro de los paréntesis):

@interface BarClass() 
@property (nonatomic, strong) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 

Es posible que desee leer esta pregunta (y respuestas), así: Does a private @property create an @private instance variable?

4

Esto es lo que hice y me funciona. El cambio es que ya no estás creando categorías. Más bien estás creando extensiones de la clase en sí.

@interface BarClass() 
@property (nonatomic, retain) BazObject *myBaz; 
@end 

@implementation BarClass 
@synthesize myBaz = _myBaz; 
[...] 
@end 
Cuestiones relacionadas