2012-01-25 2 views
4

В настоящее время я столкнулся с проблемой проверки наличия свойства объекта (NSManagedObject) или нет.Объектив C - отвечаетSoSelector для динамических свойств

К сожалению, метод

[[MyObject class] respondsToSelector:@selector(myProperty)]; 

всегда возвращает NO.

Я думаю, это потому, что собственность, достигнутая CoreData новое свойство стиля аля

@property (nonatomic, strong) NSString *myProperty 

Поэтому любые идеи, как решить эту проблему?

Я действительно ценю все ваши предложения;)

Спасибо заранее! Alex

ответ

14

[[MyObject class] respondsToSelector:...] спрашивает, отвечает ли метаобъект на этот селектор. Таким образом, в действительности, он спрашивает, существует ли метод класса с этим селектором. Ваш код не вернется ДА, если у вас:

+ (NSString *)myProperty; 

возвращает NO, потому что у вас есть эквивалент метода экземпляра:

- (NSString *)myProperty; 

Вам нужно позвонить respondsToSelector: на экземпляр вашего класса.

Обычно вы можете использовать instancesRespondToSelector: непосредственно на метаклассе (так, [MyObject instancesRespondToSelector:...]), но Core Data синтезирует соответствующие реализации метода только при создании объекта, так что это не стартер. Однако вы могли создать экземпляр с помощью обычного маршрута NSEntityDescription и проверить на нем respondsToSelector:.

Поскольку это весь Core Data, альтернатива была бы спросить NSManagedObjectModel для соответствующего NSEntityDescription через его entitiesByName словаря и проверить описание сущности мы propertiesByName словаря.

+1

Лучше ответ ... Я удалю мой! – jrturton

+0

Хорошо, но проблема в том, что у меня нет объекта экземпляра в точке, где я хочу проверить это ... Так есть ли другие возможности? – Alexander

+1

Обычно вы используете 'экземплярыRespondToSelector:' непосредственно в 'MyObject', но внутренняя часть Core Data делает это не стартером в этом случае.Таким образом, вам нужно будет получить Core Data, чтобы предоставить вам экземпляр, сделать нормальный 'responsesToSelector: ', а затем выбросить объект, а не добавить его в постоянное хранилище. – Tommy

0

Вы синтезируете свойство в файле класса?

@interface SomeClass : NSObject 
{ 
    @property (nonatomic, strong) NSString *myProperty 
} 
@end 


@implementation SomeClass 

    @synthesize myProperty; 

@end 
+0

Я использую созданные файлы CoreData, поэтому реквизиты @динамически, Томми может дать мне ответ;) – Alexander

1

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

NSArray * keys = [myObject allKeys]; 
for(NSString * key in keys) 
{ 
    NSString * string = [NSString stringWithFormat:@"set%@:", [key capitalizedString]]; 
    SEL selector = NSSelectorFromString(string); 
    if([myObject respondsToSelector:selector] == YES) 
    { 
     id object = [dict objectForKey:key]; 

     // To massage the compiler's warnings avoid performSelector 
     IMP imp = [card methodForSelector:selector]; 
     void (*method)(id, SEL, id) = (void *)imp; 
     method(myObject, selector, object); 
    } 
} 

Этот код удовлетворяет потребность в том, что вы не можете переваривать все данные, которые вы получаете в словаре. В этом случае это был редкий json, поэтому некоторые данные могут не всегда существовать в json, поэтому переход к атрибутам myObjects в поисках их соответствующего ключа будет просто большим количеством потраченного впустую усилия.

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

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