Это потому, что NSObject
сам реализует -mutableCopy
(для всех объектов, даже те, которые не соответствуют NSCopying
или NSMutableCopying
), позвонив в -mutableCopyWithZone:
(так, что все исполнители NSMutableCopying
получить просто реализовать -mutableCopyWithZone:
без необходимости повторить выполнение для -mutableCopy
).
Все, что наследуется от NSObject
отвечает -mutableCopy
, но если вы на самом деле называли, это будет катастрофа, потому что NSNumber
не реагирует на -mutableCopyWithZone:
.
Вы можете увидеть это с анализом
assert([NSObject instanceMethodForSelector:@selector(mutableCopy)] == [NSNumber instanceMethodForSelector:@selector(mutableCopy)])
bbum обобщает это очень хорошо - есть некоторые тонкие случаи края, делая эти проверки динамически, потому что вы можете получить ответы, которые вы вовсе не ожидали.
Благодарим за особенности, с которой это произошло! – bbum
Отличная информация. И если бы я просмотрел документы для NSObject: 'Это метод удобства для классов, которые принимают протокол NSMutableCopying. Исключение возникает, если нет реализации для mutableCopyWithZone:. –
@BenFlynn Ха-ха, я только наполовину это помню. Это не совсем легко обнаруживаемая функция, в коде или документации. –