2014-01-15 55 views
0

我的一般问题是如何以及如何测试以查看任意对象是否支持给定属性。对于方法来说,这很简单。我会发送一个respondsToSelector:消息给对象并检查结果。我找不到类似的属性机制。测试属性是否存在(即numberOfValidItemsForDrop)

我的具体问题是我正在写一个自定义的NSView,支持将图像文件(复数)放到它上面。我在10.9上构建,并在10.6上部署。对于运行10.7及更高版本的机器,我想利用enumerateDraggingItemsWithOptions:...方法和numberOfValidItemsForDrop属性在拖动图像(编号和可接受的文件)中提供的用户反馈。

我最初的想法如下。测试提供给draggingEntered:方法的发件人(声明为ID < NSDraggingInfo>)。如果是这样,请使用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; 
} 

这与开发环境中的属性无效是不一样的。但是,我担心numberOfValidItemsForDrop的赋值在10.6的运行时也可能有问题,即使它实际上不应该被执行。

我已经把一个小的虚拟应用程序扔到了一起,这个应用程序已经发送给我的测试人员,但还没有听到,并且想继续在这个项目上继续前进。

感谢您的任何/所有信息。

回答

2

您可以使用Objective-C运行时函数class_getProperty来测试命名属性的存在:

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

这与基于sbooth建议的使用class_getProperty()有什么不同? – MikeMayer67