Получение массива свойств для объекта в Objective-C - PullRequest
5 голосов
/ 17 декабря 2009

Возможно ли получить массив всех свойств объекта в Objective C? По сути, я хочу сделать что-то вроде этого:

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

Возможно ли это? Кажется, что так и должно быть, но я не могу понять, каким методом должен быть мой propertyNames.

Ответы [ 2 ]

9 голосов
/ 17 декабря 2009

Я сделал еще несколько копаний и нашел то, что хотел, в Objective-C Runtime Programming Guide . Вот как я реализовал то, что хотел сделать в своем первоначальном вопросе, опираясь в основном на пример кода 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]];
    }
}

Я надеюсь, что это поможет кому-то еще искать способ доступа к именам свойств объекта программно.

2 голосов
/ 06 февраля 2013

не забудь

free(properties);

после цикла или вы получите утечку. Яблочная документация понятна:

Массив указателей типа objc_property_t, описывающих свойства объявлено классом. Любые свойства, объявленные суперклассами, не являются включен. Массив содержит указатели * outCount, за которыми следует NULL терминатор. Вы должны освободить массив с помощью free () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...