Para ampliar la respuesta MVDS' (empecé a escribir esto antes de que vi de él), aquí hay un pequeño programa de ejemplo que utiliza la API de tiempo de ejecución de Objective-C para recorrer e imprimir información sobre cada propiedad en una clase:
#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);
}
}
salida: atributos
edad del inmueble: T^q, Vage
Propiedad lastName atributos: T @ "NSString", &, N, VlastName
propiedad NOMBRE atributos: T @ "NSString", &, N, VfirstName
Tenga en cuenta que este programa debe ser compilado con ARC encendido.
Una buena pregunta de seguimiento sería cómo devolver los valores de cada uno dinámicamente ... Estoy pensando crear dinámicamente un descriptor de acceso, pero sintácticamente, todavía estoy tratando de resolverlo. –
Hay varias formas de hacerlo, pero la más directa sería usar KVC: 'id value = [self valueForKey: @" propertyName "]'. Se vuelve un poco más complicado donde tiene los tipos de retorno primitivo (int, float, etc) y de objeto (NSString, etc.), pero la premisa básica funcionará. –
este código se filtra como el infierno – mvds