2013-05-25 4 views
0

Я хочу получить значения всех атрибутов объекта в Objective-C.
Например, у меня есть экземпляр моего класса Client, названный Client1.
Я хотел бы иметь метод, который получает этот объект в качестве параметра и возвращает атрибуты и значения. (name = 'nameC1', age = 21 ...)Как разобрать объект для получения значений ключей (атрибут/значение) в Objective-C?

+0

Знаете ли вы его атрибуты спереди или спрашиваете, как перечислять свойства класса? –

+0

Привет, Функция должна работать для любого объекта ... (перечислять все атрибуты + их значения) – user2421041

+0

Любой конкретный класс объекта? Или просто любые объекты? – uchuugaka

ответ

2

Этот вопрос был немного другим, но я думаю, что ответ такой же, как и ответ на ваш вопрос:

https://stackoverflow.com/a/8380836/104527

// PropertyUtil.h 
#import 

@interface PropertyUtil : NSObject 

+ (NSDictionary *)classPropsFor:(Class)klass; 

@end 


// PropertyUtil.m 
#import "PropertyUtil.h" 
#import "objc/runtime.h" 

@implementation PropertyUtil 

static const char * getPropertyType(objc_property_t property) { 
    const char *attributes = property_getAttributes(property); 
    printf("attributes=%s\n", attributes); 
    char buffer[1 + strlen(attributes)]; 
    strcpy(buffer, attributes); 
    char *state = buffer, *attribute; 
    while ((attribute = strsep(&state, ",")) != NULL) { 
     if (attribute[0] == 'T' && attribute[1] != '@') { 
      // it's a C primitive type: 
      /* 
       if you want a list of what will be returned for these primitives, search online for 
       "objective-c" "Property Attribute Description Examples" 
       apple docs list plenty of examples of what you get for int "i", long "l", unsigned "I", struct, etc.    
      */ 
      return (const char *)[[NSData dataWithBytes:(attribute + 1) length:strlen(attribute) - 1] bytes]; 
     }   
     else if (attribute[0] == 'T' && attribute[1] == '@' && strlen(attribute) == 2) { 
      // it's an ObjC id type: 
      return "id"; 
     } 
     else if (attribute[0] == 'T' && attribute[1] == '@') { 
      // it's another ObjC object type: 
      return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes]; 
     } 
    } 
    return ""; 
} 


+ (NSDictionary *)classPropsFor:(Class)klass 
{  
    if (klass == NULL) { 
     return nil; 
    } 

    NSMutableDictionary *results = [[[NSMutableDictionary alloc] init] autorelease]; 

    unsigned int outCount, i; 
    objc_property_t *properties = class_copyPropertyList(klass, &outCount); 
    for (i = 0; i < outCount; i++) { 
     objc_property_t property = properties[i]; 
     const char *propName = property_getName(property); 
     if(propName) { 
      const char *propType = getPropertyType(property); 
      NSString *propertyName = [NSString stringWithUTF8String:propName]; 
      NSString *propertyType = [NSString stringWithUTF8String:propType]; 
      [results setObject:propertyType forKey:propertyName]; 
     } 
    } 
    free(properties); 

    // returning a copy here to make sure the dictionary is immutable 
    return [NSDictionary dictionaryWithDictionary:results]; 
} 
@end 

Чтобы использовать импорт PropertyUtil.h и сделайте что-нибудь вроде:

NSDictionary props = [PropertyUtil classPropsFor:[YourClass class]]; 
+1

Ответы на конкретный вопрос. Однако не используйте этот код. Хотя такая автоматизированная глубокая интроспекция кажется временной заставкой, она приведет к хрупкой, недостижимой базе кода. – bbum

+0

Я должен полностью согласиться – powerj1984

 Смежные вопросы

  • Нет связанных вопросов^_^