agregar atributos personalizados a la propiedad no es común, pero es deseable, creo. esta característica podría usarse para personalizar el recorrido de las propiedades de una clase. Deseé esta característica cuando manejo SQL: si tenemos atributos como: EXCLUDE_FROM_SELECT
, INCLUDE_BY_INSERT
, EXCLUDE_FROM_UPDATE
... entonces sería muy agradable.
En realidad, no estoy seguro de si hay una manera de habilitarlo para la directiva @property. sin embargo, podemos hacer algo similar:
si mira el archivo objc/runtime.h podría encontrar una función: class_replaceProperty
, que no está documentada en el sitio web oficial. una función similar llamada class_addProperty
está documentada y podría ayudarlo a comprender el argumento de la anterior. En realidad, creo que @property hace uso de estas funciones para realizar la configuración de la propiedad (pero no puedo probar que lo haga).
es posible que tenga las siguientes funciones:
void class_copyPropertyList(...);
void property_copyAttributeList(...);
void class_getProperty(...);
mediante el uso de estas funciones, se podría hacer algo lo @property realmente hace.
lo que hice para el problema anterior de SQL es definir 3 funciones para registrar atributos personalizados:
void prepareClass(...);
void registerAttributes(...);
void endRegister(...);
y entonces podríamos hacer el registro en la función de la clase de +initialize
Tagart.
Sin embargo, hacer uso del código (compare con la simple @interface + @property declaration) puede no ser la mejor solución, ya que es posible que deseemos ver la configuración de la propiedad directamente de la declaración.Y en realidad podríamos hacerlo mejor mediante el uso de macros: __attribute__((constructor))
y
la @end @interface realidad le permiten hacer esto:
@interface MyVO : NSObject
__attribute__((constructor))
void prepareForMyVO(){ prepareClass(MyVO);}
@property (strong) id p1;
__attribute__((constructor))
static void registerAttrForP1(){ registerAttributes("p1", EXCLUDE_FROM_SELECT);}
@property (strong) id p2;
__attribute__((constructor))
static void registerAttrForP2(){ registerAttributes("p2", INCLUDE_BY_INSERT);}
@end
__attribute__((constructor))
static void endRegisterForMyOV(){ endRegister();};
, por lo tanto, se podría definir macros para manejar este hardcode:
#define $p(clazz, zuper) class : zuper \
__attribute__((constructor)) static void prepareFor ## clazz(){ prepareClass(#MyVO);}
#define $r(p, attr) p; \
__attribute__((constructor)) static void registerAttrFor ## p(){ registerAttributes(#p, attr);}
#define $e(clazz) __attribute__((constructor)) static void endRegister ## clazz(){ endRegister();};
@interface $p(MyVO, NSObject)
@property (strong) id $r(p1, EXCLUDE_FROM_SELECT);
@property (strong) id $r(p1, INCLUDE_BY_INSERT);
@end $e(MyVO)
PD: la codificación anterior no es la codificación exacta, solo un ejemplo. Y no estoy seguro si la última solución macro funciona espero que esto pueda ayudar.
http://stackoverflow.com/questions/4919021/custom-property-attributes-in-objective-c – rishi
@rishi, gracias, pero no estoy muy satisfecho con la respuesta a esa pregunta, ya que mi situación específica no no me permite crear otro tipo de devolución. Estoy buscando una respuesta sobre si es posible o no, y si es así, entonces cómo. – driis
No es, desafortunadamente, sin modificar el compilador. –