Как определить, имеет ли подкласс NSManagedObject определенное свойство во время выполнения - PullRequest
3 голосов
/ 08 февраля 2011

Я привык использовать doesRespondToSelector: и instancesRespondToSelector: для определения во время выполнения, есть ли у объектов определенные методы.Однако при использовании Core Data я не вижу ожидаемого поведения для моих @dynamic свойств.Например, если у меня есть свойство sortOrder в моем классе, я могу использовать среду выполнения Objective C, чтобы увидеть, что это свойство существует во время выполнения.Но если я спрашиваю соответствующий Class объект, instancesRespondToSelector:, я получу обратно NO.Если я использую среду выполнения для перечисления доступных методов, ни один из моих динамических методов получения / установки не появится в списке, что соответствует, но не так, как я ожидал.

Мой вопрос: без проверки времени выполнения, есть ли простой способ определить, отвечает ли экземпляр подкласса NSManagedObject на селекторы получателя / установщика, которые соответствуют его @dynamic свойствам?

Ответы [ 2 ]

12 голосов
/ 17 апреля 2013

Вы можете проверить NSManagmentObject, хотя NSEntityDescription:

- (BOOL)hasPropertyWithName:(NSString *)name
{
    NSEntityDescription *desc = self.entity;
    return [desc.attributesByName objectForKey:name] != nil;
}
4 голосов
/ 08 февраля 2011

Я использовал следующий метод для NSManagedObject объектов, чтобы получить список его свойств. Может быть, это укажет вам правильное направление ....

- (NSMutableArray *) propertyNames: (Class) class { 
    NSMutableArray *propertyNames = [[NSMutableArray alloc] init];
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList(class, &propertyCount);

    for (unsigned int i = 0; i < propertyCount; ++i) {
        objc_property_t property = properties[i];
        const char * name = property_getName(property);
        [propertyNames addObject:[NSString stringWithUTF8String:name]];
    }
    free(properties);
    return [propertyNames autorelease];
}
...