Если экземпляр 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];
Другие вопросы по тегам