Aby rozwinąć na odpowiedź mvds' (zacząłem pisać ten przed Widziałem jego), tutaj jest trochę przykładowy program, który korzysta z Objective-C Runtime API pętli i drukowania informacji o każdej nieruchomości w klasie:
#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);
}
}
wyjściowe: atrybuty
wiek własności: T^Q, Vage
Property lastName atrybuty: T @ "NSString" &, N, VlastName
Property firstName atrybuty: T @ "NSString", &, N, VfirstName
pamiętać, że program ten musi zostać skompilowany z ARC włączone.
Dobrym pytaniem uzupełniającym byłoby, w jaki sposób dynamicznie zwracać wartości każdego z nich ... Myślę, że dynamicznie utworzę akcesor, ale syntaktycznie, nadal próbuję to rozgryźć. –
Jest kilka sposobów na zrobienie tego, ale najprostszym rozwiązaniem byłoby użycie KVC: 'id value = [self valueForKey: @" propertyName "]'. Trochę się komplikuje, gdy masz zwracane typy zarówno pierwotne (int, float, etc), jak i object (NSString, etc), ale podstawowe założenie będzie działało. –
ten kod wycieka jak w piekle – mvds