2010-03-26 5 views
28

Quiero usar una categoría para hacer que un método de la clase original esté disponible también como propiedad.Categorías de Objective-C: ¿Puedo agregar una propiedad para un método que no esté en mi categoría?

Clase A:

@interface ClassA 
- (NSString*)foo; 
@end 

Clase A categoría

@interface ClassA (Properties) 
- (void)someCategoryMethod; 
@property (nonatomic, readonly) NSString *foo; 
@end 

Ahora cuando hago esto, parece que funciona (EDIT: Tal vez esto no funciona, no lo hace quejarse pero estoy viendo extrañeza), pero me da advertencias porque no estoy sintetizando la propiedad en la implementación de mi categoría. ¿Cómo le digo al compilador que todo está bien ya que la clase original me sintetiza la propiedad?

+0

Las propiedades son (principalmente) solo azúcar para un método '-foo' y' -setFoo'. No puede agregar variables de instancia adicionales en categorías, pero puede definir esos métodos. La sintaxis @property es opcional, pero se sugiere (no estoy seguro de si funciona). –

+1

Para cualquiera que intente agregar una propiedad con un respaldo ivar (también se define en la categoría), consulte esto: http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with- associative-references/ – Senseful

+0

posible duplicado de [Objective-C: Property in Category] (http://stackoverflow.com/questions/8733104/objective-c-property-in-category) – hfossli

Respuesta

32

Aquí está la advertencia de que está recibiendo:

warning: property ‘foo’ requires method '-foo' to be defined - use @synthesize, @dynamic or provide a method implementation

Para suprimir esta advertencia, tener esto en su aplicación:

@dynamic foo;

+0

¡Justo lo que necesitaba, gracias! –

1

Si algo está declarado en la interfaz de su categoría, su definición pertenece a la implementación de su categoría.

+0

Pero no tengo acceso al fuente de 'ClassA'. Digamos que es clase en UIKit que estoy "mejorando". –

+0

Probablemente deberías estar creando una subclase, no una categoría. –

+3

Si es una subclase, las instancias de esta clase creadas en áreas que no tengo control no tendrán este código y propiedades. –

Cuestiones relacionadas