2

Right, I'm officially confused.

This is called in a NSTableView subclass on 10.8 and as we can learn from the docs and the headers NSTableView implements NSDraggingSource so all should be good:

 if ([super respondsToSelector:@selector(draggingSession:movedToPoint:)])
    [super draggingSession:session movedToPoint:screenPoint];

When the containing method (override of draggingSession:movedToPoint: in the subclass) is called, the second line however throws the beloved 'unrecognized selector sent to instance 0x1054092c0' exception.

Could anybody please explain what is going on here?!

4

3 回答 3

3

首先,[super respondsToSelector:@selector(draggingSession:movedToPoint:)]是一样的[self respondsToSelector:@selector(draggingSession:movedToPoint:)]super允许您调用给定方法的超类实现;在这种情况下,respondsToSelector:。但是如果你的类(或者这个对象是什么类)没有覆盖-respondsToSelector:(99.9% 的类不需要覆盖-respondsToSelector:),那么超类的实现与self. 基本上,在这两种情况下,您都在检查当前对象 ( self) 是否响应选择器。

所以,你看到的是:self响应选择器,但是这个类的超类没有选择器的实现。这意味着什么?无论是当前类,还是当前类之间的某个类,self都实现了这个方法。这就是为什么self回应它。但是没有超类实现。

于 2014-03-03T04:03:39.977 回答
0

正确的代码实际上是:

if ([[NSTableView class] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)])
    [super draggingSession:session movedToPoint:screenPoint];

正如 newacct 所指出的,super指的是实现该方法的类的超类,而[self superclass]它是调用它的实例的超类,它可能是您的自定义类的子类(的孙子类NSTableView)。当然,您不太可能创建这样的子类,但您不妨做正确的事情,而且这段代码的意图更清晰。

于 2014-03-12T20:40:08.863 回答
-1

感谢您的提示 -
这确实可以正常工作:

 if ([[self superclass] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)])
    [super draggingSession:session movedToPoint:screenPoint];
于 2014-03-02T08:20:04.603 回答