2009-07-31 34 views
22

Nếu tôi có một lớp, làm thế nào tôi có thể liệt kê tất cả các tên biến thể hiện của nó?Làm cách nào để liệt kê tất cả các trường của đối tượng trong Mục tiêu-C?

ví dụ:

@interface MyClass : NSObject { 
    int myInt; 
    NSString* myString; 
    NSMutableArray* myArray; 
} 

Tôi muốn để có được "myInt", "myString", và "myArray". Có cách nào để có thể nhận được một mảng các tên mà tôi có thể lặp lại không?

Tôi đã thử tìm kiếm tài liệu Objective-C nhưng không thể tìm thấy bất kỳ thứ gì (và tôi cũng không biết điều này được gọi là gì).

+0

Bạn đang làm việc từ mã nguồn (trong trường hợp này bạn cần một phân tích cú pháp Objective-C) hoặc trong thời gian chạy (trong trường hợp nào bạn có thể sử dụng API thời gian chạy Objective-C)? –

+0

Mã nguồn, ví dụ: các biến sẽ không thay đổi trong suốt thời gian chạy và tất cả được xác định trong mã nguồn. Tôi đang cố gắng viết một chức năng chung để viết ra một plist. Tôi biết tôi có thể sử dụng NSDictionary để làm điều đó nhưng tôi muốn tránh tự thêm mã trên tất cả các nơi khi tôi thêm một biến lớp mới, do đó câu hỏi. –

+0

Nghe có vẻ như bạn thực sự có ý nghĩa trong thời gian chạy. –

Trả lời

40

Như đã đề cập, bạn có thể sử dụng API Objective-C runtime để lấy ví dụ tên biến:

unsigned int varCount; 

Ivar *vars = class_copyIvarList([MyClass class], &varCount); 

for (int i = 0; i < varCount; i++) { 
    Ivar var = vars[i]; 

    const char* name = ivar_getName(var); 
    const char* typeEncoding = ivar_getTypeEncoding(var); 

    // do what you wish with the name and type here 
} 

free(vars); 
+0

Cảm ơn đó chỉ là những gì tôi cần. –

+3

Bạn cũng sẽ cần điều này: #import

+0

Tại sao tính năng này không hoạt động đối với NSManagedObject? –

0

Xem xét gen_bridge_metadata, được thiết kế cho một mục đích hoàn toàn khác, nhưng có thể tạo tệp XML từ các tệp tiêu đề Objective-C.

1
#import <objc/runtime.h> 


NSUInteger count; 
Ivar *vars = class_copyIvarList([self class], &count); 
for (NSUInteger i=0; i<count; i++) { 
    Ivar var = vars[i]; 
    NSLog(@"%s %s", ivar_getName(var), ivar_getTypeEncoding(var)); 
} 
free(vars); 
+1

Bạn cần thêm miễn phí (vars); như @JHH ở trên hoặc bạn có vấn đề về bộ nhớ – amergin

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