我的主要问题是,是否以及如何能够测试一个任意对象是否支持给定的属性。对于方法,这很简单。我会向对象发送一个respondsToSelector:消息并检查结果。我在物业方面找不到类似的机制。
我手头的具体问题是,我正在编写一个自定义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;
}这与该属性在开发环境中无效并不是一回事。但是,我担心的是,在运行时10.6上,分配给numberOfValidItemsForDrop可能也有问题,即使它永远不应该实际执行。
我已经建立了一个小的虚拟应用程序,我已经发送给我的测试人员,但还没有收到回音,并希望继续推进这个项目。
谢谢您提供的任何/全部信息。
发布于 2014-01-15 11:41:50
您可以使用Objective运行时函数class_getProperty来测试是否存在命名的属性:
if(class_getProperty([self class], "numberOfValidItemsForDrop")) {
// property exists
}发布于 2014-01-15 11:48:29
若要检查某个属性是否存在,可以将其用作:假定该属性不为readonly。
if ([yourClassObject respondsToSelector:@selector(set<yourPropertyName>:)]) {
NSLog(@"yes it exists");
}
else{
NSLog(@"no it doesn't exists");
}https://stackoverflow.com/questions/21136355
复制相似问题