Comment déterminer dynamicment le type de propriété Objective-C?

J'essaie de déterminer dynamicment le type d'une propriété dans Objective-C. Sur la base de ce que j'ai lu sur ce site et ailleurs, je crois que je fais la bonne chose. Cependant, mon code ne fonctionne pas.

L'extrait de code ci-dessous illustre le problème. Tenter d'get les informations de propriété pour "backgroundColor" et "frame", qui sont toutes deux des propriétés valides de UIView, échoue (class_getProperty () renvoie NULL):

id type = [UIView class]; objc_property_t backgroundColorProperty = class_getProperty(type, "backgroundColor"); fprintf(stdout, "backgroundColorProperty = %d\n", (int)backgroundColorProperty); // prints 0 objc_property_t frameProperty = class_getProperty(type, "frame"); fprintf(stdout, "frameProperty = %d\n", (int)frameProperty); // prints 0 

L'énumération des propriétés décrites ici ne produit pas non plus les résultats attendus. Le code suivant:

 NSLog(@"Properties for %@", type); unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(type, &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; fprintf(stdout, "%s %s\n", property_getName(property), property_getAtsortingbutes(property)); } 

génère cette sortie:

 2012-03-09 13:18:39.108 IOSTest[2921:f803] Properties for UIView caretRect T{CGRect={CGPoint=ff}{CGSize=ff}},R,N,G_caretRect gesturesEnabled Tc,N deliversTouchesForGesturesToSuperview Tc,N skipsSubviewEnumeration Tc,N viewTraversalMark Tc,N viewDelegate T@"UIViewController",N,G_viewDelegate,S_setViewDelegate: inAnimatedVCTransition Tc,N,GisInAnimatedVCTransition monitorsSubtree Tc,N,G_monitorsSubtree,S_setMonitorsSubtree: backgroundColorSystemColorName T@"NSSsortingng",&,N,G_backgroundColorSystemColorName,S_setBackgroundColorSystemColorName: userInteractionEnabled Tc,N,GisUserInteractionEnabled tag Ti,N,V_tag layer T@"CALayer",R,N,V_layer 

Les propriétés documentées telles que "backgroundColor", "frame" et autres sont manquantes, tandis que les propriétés non documentées telles que "caretRect" et "gesturesEnabled" sont incluses.

Toute aide sera la bienvenue. Dans le cas où cela est pertinent, je vois ce comportement sur le simulateur iOS. Je ne sais pas si la même chose se produirait sur un appareil réel.

Merci, Greg

Vous obtenez les propriétés UIView, le problème est backgroundColor n'est pas une propriété UIView, est une propriété de catégorie. Vérifiez UIView.h. Je pense que vous ne pouvez pas get une objc_category, mais jetez un oeil à class-dump.

Esquivant légèrement le problème, les travaux suivants:

 NSMethodSignature *signature = [[UIView class] instanceMethodSignatureForSelector:@selector(backgroundColor)]; NSLog(@"%s", [signature methodReturnType]); 

Ainsi, le moteur d'exécution a peut-être perdu le fait que backgroundColor est une propriété, mais il semble que vous commenciez à utiliser cette information dans le premier extrait de code, de sorte qu'il ne vérifie que le type de return du getter.

Vous pouvez find les propriétés de catégorie en tant que methods.

 @import ObjectiveC; static void test(Class class, NSSsortingng* methodName) { Method method = class_getInstanceMethod(class, NSSelectorFromSsortingng(methodName)); const char* type = method_copyReturnType(method); printf("%s : %s\n", methodName.UTF8Ssortingng, type); free((void*)type); } 

Ensuite, vous inspectez certains …

 test([UILabel class], @"alpha"); test([UILabel class], @"textColor"); test([UILabel class], @"isHidden"); test([UILabel class], @"minimumScaleFactor"); 

Après avoir regardé ces définitions dans runtime.h

 #define _C_ID '@' #define _C_CLASS '#' #define _C_SEL ':' #define _C_CHR 'c' #define _C_UCHR 'C' #define _C_SHT 's' #define _C_USHT 'S' #define _C_INT 'i' #define _C_UINT 'I' ... 

N'oubliez pas de respecter la notation getters / setters pour les propriétés BOOL, cherchez 'isHidden' à la place 'hidden'.