l'aggiunta di attributi personalizzati alla proprietà non è comune ma auspicabile. questa funzione potrebbe essere utilizzata per personalizzare l'attraversamento delle proprietà di una classe. Ho desiderato questa funzionalità quando gestisco SQL: se abbiamo attributi come: EXCLUDE_FROM_SELECT
, INCLUDE_BY_INSERT
, EXCLUDE_FROM_UPDATE
... allora sarebbe molto bello.
In realtà, non sono sicuro che ci sia un modo per abilitarlo per la direttiva @property. tuttavia, potremmo fare qualcosa di simile:
se si osserva objc/runtime.h è possibile trovare una funzione: class_replaceProperty
, che non è documentata nel sito Web ufficiale. una funzione simile denominata class_addProperty
è documentata e potrebbe aiutarti a capire l'argomento del precedente. In realtà, penso che @property utilizzi queste funzioni per eseguire le impostazioni delle proprietà (ma non riesco a dimostrarlo).
potrebbe essere necessario anche le seguenti funzioni:
void class_copyPropertyList(...);
void property_copyAttributeList(...);
void class_getProperty(...);
utilizzando queste funzioni, si potrebbe fare qualcosa quello @property realmente fa.
quello che ho fatto per il precedente problema di SQL è quello di definire 3 funzioni per registrare attributi personalizzati:
void prepareClass(...);
void registerAttributes(...);
void endRegister(...);
E poi abbiamo potuto fare il registro in funzione +initialize
della classe tagart.
Tuttavia, l'utilizzo del codice (confrontare con la semplice @interface + @property declaration) potrebbe non essere la soluzione migliore, perché potremmo voler vedere le impostazioni delle proprietà direttamente dalla dichiarazione.E in realtà siamo riusciti a fare meglio utilizzando __attribute__((constructor))
e le macro:
il @end @interface in realtà permette lo fare questo:
@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();};
conseguenza, è possibile definire le macro per gestire questa 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)
PS: la codifica di cui sopra non è la codifica esatta, è solo un esempio. E non sono sicuro che l'ultima macro soluzione funzioni spero che questo possa aiutare.
http://stackoverflow.com/questions/4919021/custom-property-attributes-in-objective-c – rishi
@rishi, grazie, ma non sono molto soddisfatto della risposta a questa domanda, poiché la mia situazione specifica non mi consente di creare un altro tipo di reso. Sto cercando una risposta sul fatto che sia possibile o meno - e se sì, allora come. – driis
Non è, sfortunatamente, senza modificare il compilatore. –