Если экземпляр responsedsToSelector - почему до сих пор "нераспознанный селектор отправлен в экземпляр"?
Да, я официально запутался.
Это называется в NSTableView
подкласс на 10,8, и, как мы можем узнать из документов и заголовков NSTableView
инвентарь NSDraggingSource
так что все должно быть хорошо
if ([super respondsToSelector:@selector(draggingSession:movedToPoint:)])
[super draggingSession:session movedToPoint:screenPoint];
Когда содержащий метод (переопределение draggingSession:movedToPoint:
в подклассе), вторая строка, тем не менее, выбрасывает исключение " нераспознанный селектор, отправленный экземпляру 0x1054092c0 ".
Кто-нибудь может объяснить, что здесь происходит?!
3 ответа
Первый, [super respondsToSelector:@selector(draggingSession:movedToPoint:)]
такой же как [self respondsToSelector:@selector(draggingSession:movedToPoint:)]
, super
позволяет вам вызывать реализацию суперкласса данного метода; в этом случае, respondsToSelector:
, Но если ваш класс (или любой другой класс этого объекта) не переопределяет -respondsToSelector:
(99,9% классов не нужно переопределять -respondsToSelector:
), то реализация суперкласса такая же, как и реализация класса self
, По сути, в обоих случаях вы проверяете, является ли текущий объектself
) отвечает на селектор.
Итак, что вы видите это: self
отвечает на селектор, но суперкласс класса, в котором он находится, не имеет реализации для селектора. Что это значит? Либо текущий класс, либо где-то между текущим классом в качестве класса self
этот метод реализован. Вот почему self
отвечает на это. Но нет реализации суперкласса.
Правильный код на самом деле:
if ([[NSTableView class] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)])
[super draggingSession:session movedToPoint:screenPoint];
Как указано newacct, super
относится к суперклассу класса, в котором реализован метод, тогда как [self superclass]
это суперкласс экземпляра, в котором он вызывается, который может быть подклассом вашего пользовательского класса (внук NSTableView
). Конечно, маловероятно, что вы создадите такой подкласс, но вы могли бы также сделать все правильно, и этот код в любом случае более ясен в своем намерении.
Спасибо за подсказки -
это действительно работает нормально:
if ([[self superclass] instancesRespondToSelector:@selector(draggingSession:movedToPoint:)])
[super draggingSession:session movedToPoint:screenPoint];