Siempre he pensado que no se puede declarar una propiedad de objeto en una categoría. Hasta que mi compañero lo hizo en el código de nuestra aplicación, y pareció funcionar.¿Desde cuándo es posible declarar las propiedades de Objective-C 2.0 en una categoría?
Me embarqué en un SO y en Google para tratar de explicarle que no, las categorías de Objective-C solo se pueden usar para agregar métodos, no propiedades. He encontrado a preguntas tales como:
- Setting New Property In Category Interface Implementation (mirar la respuesta aceptada)
- Can I add a property for a method not in my category?
Pero entonces me encontré this link en el sitio de Apple que contiene lo siguiente acerca de la declaración @property:
Una declaración de propiedad comienza con la palabra clave @property. @property puede aparecer en cualquier parte de la lista de declaración de método que se encuentra en @interface de una clase. @property puede aparecer también en la declaración de un protocolo o categoría. (Énfasis añadido)
Sé que esto no funciona:
@interface MyClass()
NSInteger foobar;
- (void) someCategorizedMethod;
@end
Pero esto compila:
@interface MyClass()
@property NSInteger foobar;
- (void) someCategorizedMethod;
@end
Mi pregunta es (a) ¿cuál es la mejor práctica aquí? y (b) ¿es algo nuevo en Objective-C 2.0 y, en lugar de utilizar un iVar "real", simplemente utiliza el almacenamiento asociativo entre bastidores para que funcione?
Para añadir a esto, su primer ejemplo en el que se añade un Ivar es perfectamente válido en llvm con -Xclang -fobjc-no frágiles-abi2 –
Lo sería si estuviera agregando una Ivar. En ese caso, él está agregando una variable estática que no es una variable de instancia. – bbum
gracias por la extensa explicación. ¡Compartiré este enlace con mis socios de codificación! – makdad