Per espandere sulla risposta MVDS' (iniziato a scrivere questo prima ho visto la sua), ecco un esempio di programma poco che utilizza il runtime API Objective-C per scorrere e stampare le informazioni su ogni proprietà in una classe:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface TestClass : NSObject
@property (nonatomic, retain) NSString *firstName;
@property (nonatomic, retain) NSString *lastName;
@property (nonatomic) NSInteger *age;
@end
@implementation TestClass
@synthesize firstName;
@synthesize lastName;
@synthesize age;
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
unsigned int numberOfProperties = 0;
objc_property_t *propertyArray = class_copyPropertyList([TestClass class], &numberOfProperties);
for (NSUInteger i = 0; i < numberOfProperties; i++)
{
objc_property_t property = propertyArray[i];
NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
NSString *attributesString = [[NSString alloc] initWithUTF8String:property_getAttributes(property)];
NSLog(@"Property %@ attributes: %@", name, attributesString);
}
free(propertyArray);
}
}
uscita: attributi
età proprietà: T^q, Vage
proprietà lastName attributi: T @ "NSString", &, N, VlastName
proprietà firstName attributi: T @ "NSString", &, N, VfirstName
Si noti che questo programma deve essere compilato con ARC acceso.
fonte
2012-02-13 23:20:14
Una buona domanda di followup sarebbe come restituire i valori di ciascuno in modo dinamico ... Sto pensando di creare dinamicamente una accessor, ma sintatticamente, sto ancora cercando di capirlo. –
Ci sono un paio di modi per farlo, ma il più semplice sarebbe usare KVC: 'id value = [self valueForKey: @" propertyName "]'. Diventa un po 'più complicato in cui si hanno tipi di ritorno primitivi (int, float, ecc.) E object (NSString, ecc.), Ma la premessa di base funzionerà. –
questo codice fa trapelare come l'inferno – mvds