2009-12-17 5 views
5

¿Es posible obtener una matriz de todas las propiedades de un objeto en Objective C? Básicamente, lo que quiero hacer es algo como esto:Obtener una matriz de propiedades para un objeto en Objective-C

- (void)save { 
    NSArray *propertyArray = [self propertyNames]; 
    for (NSString *propertyName in propertyArray) { 
     [self doSomethingCoolWithValue:[self valueForKey:propertyName]]; 
    } 
} 

es esto posible? Parece que debería ser, pero no puedo averiguar qué método debería tener mi propertyNames.

Respuesta

9

Hice un poco más de excavación, y encontré lo que quería en el Objective-C Runtime Programming Guide. Así es como yo he implementado el lo que quería hacer en mi pregunta original, basándose en gran medida de código de ejemplo de Apple:

#import <Foundation/NSObjCRuntime.h> 
#import <objc/runtime.h> 

- (void)save { 
    id currentClass = [self class]; 
    NSString *propertyName; 
    unsigned int outCount, i; 
    objc_property_t *properties = class_copyPropertyList(currentClass, &outCount); 
    for (i = 0; i < outCount; i++) { 
     objc_property_t property = properties[i]; 
     propertyName = [NSString stringWithCString:property_getName(property)]; 
     [self doSomethingCoolWithValue:[self valueForKey:propertyName]]; 
    } 
} 

espero que esto ayudará a otra persona en busca de una forma de acceder a los nombres de las propiedades de un objeto programaticamente

+0

Si busca 'class_copyPropertyList' esta pregunta se ha respondido varias veces en StackOverflow en diversas formas, pero a menos que ya sabe la respuesta, si es difícil saber qué buscar ...;) –

+0

necesita gratuita (propiedades) al final. – eugene

+1

@JohnBiesnecker 'stringWithCString:' está en desuso. Estoy usando 'stringWithCString: encoding:' con la codificación 'NSUTF8StringEncoding' ahora. Solo una nota. :) –

2

No se olvide

free(properties); 

después del bucle o se obtendrá una fuga. La documentación de manzana es clara:

una matriz de punteros de tipo objc_property_t describir las propiedades declarados por la clase. Las propiedades declaradas por superclases no están incluidas en . El conjunto contiene punteros * outCount seguidos de un terminador NULL . Debe liberar la matriz con free().

Cuestiones relacionadas