programacion origen lenguaje definicion compilador caracteristicas apple objective-c properties

objective c - origen - Objetivo: C: ¿Recorrer todas las propiedades de una clase?



swift lenguaje de programacion definicion (4)

No tengo privilegios de comentarios todavía, pero para agregar a la respuesta de @ Costique, hay un atributo Tipo de valor "V" adicional que es el nombre del IVar al que se puede vincular una propiedad (a través de sintetizar). Esto se puede descubrir fácilmente con este

@interface Redacted: NSObject

@property (atomic, readonly) int foo;

@fin

@ Implementación Redactada

@synthesize foo = fooBar;

@fin

// for all properties unsigned propertyCount = 0; objc_property_t *properties = class_copyPropertyList([object class], &propertyCount); for (int prop = 0; prop < propertyCount; prop++) { // for all property attributes unsigned int attributeCount = 0; objc_property_attribute_t* attributes = property_copyAttributeList(property, &attributeCount); for (unsigned int attr = 0; attr < attributeCount; attr++) { NSLog(@"Attribute %d: name: %s, value: %s", attr, attributes[attr].name, attributes[attr].value); } }

2013-07-08 13: 47: 16.600 Redacted5162: 303] Atributo 0: nombre: T, valor: i

2013-07-08 13: 47: 16.601 Redactado [5162: 303] Atributo 1: nombre: R, valor:

2013-07-08 13: 47: 16.602 Redacted [5162: 303] Atributo 2: nombre: V, valor: fooBar

¿Hay una manera de recorrer todas las propiedades de un objeto y obtener su "nombre" y "valor"?

Estoy tratando de escribir una categoría para serializar objetos en una cadena, en función de su nombre y valores de propiedad. Estoy tratando de evitar la escritura de métodos de codificación para cada clase, y en cambio escribo uno genérico.

es posible?


Puede usar este código para enumerar todas las propiedades declaradas en una clase y todos los atributos de las propiedades. Supongo que estás más interesado en analizar el atributo de tipo. Se detallan here .

unsigned int numOfProperties; objc_property_t *properties = class_copyPropertyList([self class], &numOfProperties); for ( unsigned int pi = 0; pi < numOfProperties; pi++ ) { // Examine the property attributes unsigned int numOfAttributes; objc_property_attribute_t *propertyAttributes = property_copyAttributeList(properties[pi], &numOfAttributes); for ( unsigned int ai = 0; ai < numOfAttributes; ai++ ) { switch (propertyAttributes[ai].name[0]) { case ''T'': // type break; case ''R'': // readonly break; case ''C'': // copy break; case ''&'': // retain break; case ''N'': // nonatomic break; case ''G'': // custom getter break; case ''S'': // custom setter break; case ''D'': // dynamic break; default: break; } } free(propertyAttributes); } free(properties);


Tal vez class_copyPropertyList() haga lo que está buscando después, pero observe que solo devuelve las propiedades declaradas.

No todas las propiedades están declaradas: NSDictionary y NSMutableDictionary son ejemplos de clases en las que puede establecer propiedades que no están declaradas en la clase.

Más en los docs .


Uso la siguiente categoría en NSObject para decir, por ejemplo, NSLog(@"%@", [someObject propertiesPlease]); , lo que resulta en una entrada de registro como ...

someObject: { color = "NSCalibratedRGBColorSpace 0 0 1 1"; crayon = Blueberry; }

NSObject + Additions.h

@interface NSObject (Additions) - (NSDictionary *)propertiesPlease; @end

NSObject + Additions.m

@implementation NSObject (Additions) - (NSDictionary *)propertiesPlease { NSMutableDictionary *props = [NSMutableDictionary dictionary]; unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)]; id propertyValue = [self valueForKey:(NSString *)propertyName]; if (propertyValue) [props setObject:propertyValue forKey:propertyName]; } free(properties); return props; } @end