2017-02-06 19 views

ответ

5

Это потому, что NSObject сам реализует -mutableCopy (для всех объектов, даже те, которые не соответствуют NSCopying или NSMutableCopying), позвонив в -mutableCopyWithZone: (так, что все исполнители NSMutableCopying получить просто реализовать -mutableCopyWithZone: без необходимости повторить выполнение для -mutableCopy).

Все, что наследуется от NSObject отвечает -mutableCopy, но если вы на самом деле называли, это будет катастрофа, потому что NSNumber не реагирует на -mutableCopyWithZone:.

Вы можете увидеть это с анализом

assert([NSObject instanceMethodForSelector:@selector(mutableCopy)] == [NSNumber instanceMethodForSelector:@selector(mutableCopy)]) 

bbum обобщает это очень хорошо - есть некоторые тонкие случаи края, делая эти проверки динамически, потому что вы можете получить ответы, которые вы вовсе не ожидали.

+1

Благодарим за особенности, с которой это произошло! – bbum

+1

Отличная информация. И если бы я просмотрел документы для NSObject: 'Это метод удобства для классов, которые принимают протокол NSMutableCopying. Исключение возникает, если нет реализации для mutableCopyWithZone:. –

+0

@BenFlynn Ха-ха, я только наполовину это помню. Это не совсем легко обнаруживаемая функция, в коде или документации. –

4

Это странно. Я бы не ожидал, что класс будет реализовывать -mutableCopy. Может быть выпадением из меченой реализации указателя (если так, то @ (REALLYBIGNUMBERTHATISNEARMAX) изменит поведение).

Тонкий урок состоит в том, что вы не можете использовать respondsToSelector: для общих тестов функциональности. Вы также не можете использовать isKindOfClass:. Существует много ситуаций, в которых это может потерпеть неудачу (NSArray против NSMutableArray используется для того, чтобы вести себя очень странно - все равно - при попытке использовать интроспекцию для определения изменчивости, например).

Интроспекция хорошо работает для явно заявленных ситуаций, таких как делегирование или источники данных. Места, где есть объявление @protocol, в котором определен определенный набор методов @optional.

 Смежные вопросы

  • Нет связанных вопросов^_^