Câu trả lời của @ user529758 sẽ không hoạt động với ARC và nó sẽ không liệt kê các thuộc tính của bất kỳ lớp tổ tiên nào.
Để khắc phục điều này, bạn cần phải đi qua phân cấp lớp và sử dụng ARC2 tương thích [NSObject valueForKey:]
để nhận giá trị thuộc tính.
Person.h:
#import <Foundation/Foundation.h>
extern NSMutableArray *propertyNamesOfClass(Class klass);
@interface Person : NSObject
@property (nonatomic) NSString *name;
@end
Person.m:
#import "Person.h"
#import <objc/runtime.h>
NSMutableArray *propertyNamesOfClass(Class klass) {
unsigned int count;
objc_property_t *properties = class_copyPropertyList(klass, &count);
NSMutableArray *rv = [NSMutableArray array];
for (unsigned int i = 0; i < count; i++)
{
objc_property_t property = properties[i];
NSString *name = [NSString stringWithUTF8String:property_getName(property)];
[rv addObject:name];
}
free(properties);
return rv;
}
@implementation Person
- (NSMutableArray *)allPropertyNames {
NSMutableArray *classes = [NSMutableArray array];
Class currentClass = [self class];
while (currentClass != nil && currentClass != [NSObject class]) {
[classes addObject:currentClass];
currentClass = class_getSuperclass(currentClass);
}
NSMutableArray *names = [NSMutableArray array];
[classes enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(Class currentClass, NSUInteger idx, BOOL *stop) {
[names addObjectsFromArray:propertyNamesOfClass(currentClass)];
}];
return names;
}
- (NSString*)description {
NSMutableArray *keys = [self allPropertyNames];
NSMutableDictionary *properties = [NSMutableDictionary dictionaryWithCapacity:keys.count];
[keys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) {
properties[key] = [self valueForKey:key];
}];
NSString *className = NSStringFromClass([self class]);
return [NSString stringWithFormat:@"%@ : %@", className, properties];
}
Student.h:
#import "Person.h"
@interface Student : Person
@property (nonatomic) NSString *studentID;
@end
Student.m:
#import "Student.h"
@implementation Student
@end
main.m:
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
Student *student = [[Student alloc] init];
student.name = @"John Doe";
student.studentID = @"123456789";
NSLog(@"student - %@", student);
}
return 0;
}
Đừng đặt tên cho phương pháp với các 'get 'tiền tố; chỉ giới hạn trong một trường hợp sử dụng rất cụ thể và đây không phải là trường hợp đó. – bbum
Trên iOS, hãy cân nhắc sử dụng IBOutletCollection. Điều này là khá nhiều những gì nó tồn tại. http://www.bobmccune.com/2011/01/31/using-ios-4s-iboutletcollection/ – isaac