2009-12-17 44 views
5

Có thể lấy một mảng của tất cả các thuộc tính của đối tượng trong Objective C không? Về cơ bản, những gì tôi muốn làm là một cái gì đó như thế này:Lấy một mảng các thuộc tính cho một đối tượng trong Objective-C

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

Điều này có thể? Nó có vẻ như nó nên được, nhưng tôi không thể tìm ra phương pháp của tôi propertyNames lên có nên.

Trả lời

9

Tôi đã tìm hiểu thêm và tìm thấy những gì tôi muốn trong Objective-C Runtime Programming Guide. Đây là cách tôi đã thực hiện những gì tôi muốn làm trong câu hỏi ban đầu của tôi, vẽ nặng nề từ mẫu mã của 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]]; 
    } 
} 

Tôi hy vọng điều này sẽ giúp người khác tìm kiếm một cách để truy cập vào tên của thuộc tính của một đối tượng theo chương trình.

+0

Nếu bạn tìm kiếm 'class_copyPropertyList' câu hỏi này đã được trả lời nhiều lần trên StackOverflow dưới nhiều hình thức khác nhau, nhưng trừ khi bạn biết câu trả lời, nếu khó biết gì cần tìm kiếm ...;) –

+0

bạn cần (thuộc tính) ở cuối. – eugene

+1

@JohnBiesnecker 'stringWithCString:' không được chấp nhận. Tôi đang sử dụng mã hóa 'stringWithCString: encoding:' với 'NSUTF8StringEncoding' ngay bây giờ. Chỉ cần một lưu ý. :) –

2

không quên

free(properties); 

sau khi vòng lặp hoặc bạn sẽ nhận được một sự rò rỉ. Tài liệu hướng dẫn rõ ràng:

Một loạt các con trỏ loại objc_property_t mô tả thuộc tính được khai báo bởi lớp. Bất kỳ thuộc tính nào được khai báo bởi các lớp bậc trên đều không được bao gồm . Mảng chứa * con trỏ outCount theo sau là một NULL terminator. Bạn phải giải phóng mảng miễn phí().

Các vấn đề liên quan