2014-01-15 4 views
0

Мой общий вопрос: если и как можно проверить, поддерживает ли произвольный объект данное свойство. Для методов это просто. Я отправил бы ответ replyToSelector: сообщение объекту и проверить результат. Я не могу найти аналогичный механизм для свойств.Тестирование на существование свойства (т. Е. NumberOfValidItemsForDrop)

Моя конкретная проблема заключается в том, что я пишу пользовательский NSView, который поддерживает удаление файлов изображений (множественное число) на него. Я строию 10.9 и развертываю 10.6. Для машин с 10.7 и более поздними версиями я хотел бы воспользоваться обратной связью пользователя, представленной в изображении перетаскивания (число и допустимые файлы), с помощью метода enumerateDraggingItemsWithOptions:... и свойства numberOfValidItemsForDrop.

Моя первоначальная мысль заключается в следующем. Проверьте отправителя (объявленный id < NSDraggingInfo>), предоставленный методу draggingEntered:. Если это так, используйте механизмы, предусмотренные в 10.7. Если нет, вернитесь к более ранним механизмам.

if([sender respondsToSelector:@selector(enumerateDraggingItemsWithOptions:forView:classes:searchOptions:usingBlock:) ]) 
{ 
    __block NSInteger n=0; 
    [sender enumerateDraggingItemsWithOptions:NSDraggingItemEnumerationClearNonenumeratedImages 
            forView:self 
            classes:types 
           searchOptions:options 
           usingBlock:^(NSDraggingItem *draggingItem, NSInteger idx, BOOL *stop) { ++n; } ]; 
    self.numberOfValidItemsForDrop = n; 
    rval = (n>0 ? NSDragOperationCopy : NSDragOperationNone); 
} 
else 
{ 
    NSArray *itemsInDrag = [[sender draggingPasteboard] readObjectsForClasses:types options:options]; 
    rval = [itemsInDrag count]>0 ? NSDragOperationCopy : NSDragOperationNone); 
} 

Меня беспокоит то, является ли назначение на numberOfValidItemsForDrop вызовет проблемы в 10.6 среде. Я собрал быстрый тест, в котором я назначил фиктивное свойство внутри условия if (0), и компилятор задохнулся.

if(0) 
{ 
    sender.bogus=1; 
} 

Это не то же самое, что свойство недействительно в среде разработки. Но, это меня беспокоит, что назначение numOfValidItemsForDrop также может быть проблемой во время выполнения на 10.6, даже если оно никогда не должно выполняться.

Я собрал небольшое приложение-манекен, которое я отправил моему тестеру, но еще не слышал назад и хотел бы продолжить работу над этим проектом.

Спасибо за любую/всю информацию.

ответ

2

Вы можете использовать функцию class_getProperty Objective-C во время выполнения для проверки существования именованного свойства:

if(class_getProperty([self class], "numberOfValidItemsForDrop")) { 
    // property exists 
} 

См https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

Я попробую это. И проверит также ссылку. – MikeMayer67

+0

Это отвечает на тестовую половину вопроса гораздо более прямым образом, чем я предлагал (тестирование связанного метода). Но у меня все еще есть большой вопрос относительно того, будет ли установка свойства внутри предложения if безопасным, если свойство не существует. – MikeMayer67

+0

Я думаю, что только проверить свойство Obj-C - это дорогостоящее дело. –

1

Чтобы проверить, если свойство существует или нет, вы можете использовать в качестве : Предполагается, что имущество не должно быть readonly.

if ([yourClassObject respondsToSelector:@selector(set<yourPropertyName>:)]) { 
    NSLog(@"yes it exists"); 
} 
else{ 
    NSLog(@"no it doesn't exists"); 
} 
+1

Является ли это принципиально иным, чем использование class_getProperty(), как предложено sbooth? – MikeMayer67

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