Продлить на оттянутый ответ:
Это вопрос иерархии. Категории на самом деле просто средство организации исходных файлов. При компиляции все методы класса, включая методы, определенные в любой категории, оказываются в одном файле.
Все, что вы могли бы сделать в обычном интерфейсе класса, вы можете сделать в категории, а все, что вы не должны делать в обычном интерфейсе класса, вы не должны делать в категории.
Итак:
Методы категории не должны переопределять
существующие методы (класс или экземпляр)
Вы можете использовать методы, определенные в обычном интерфейсе класса, чтобы переопределить унаследованные методы, чтобы вы могли переопределить унаследованные методы в категории.
Однако вы бы никогда не попытались использовать два одинаковых определения метода в одном и том же обычном интерфейсе, поэтому у вас никогда не должно быть метода в категории, имя которого совпадает с именем метода в обычном интерфейсе или другой категории в одном и том же интерфейсе. учебный класс. Поскольку все определения методов оказываются в одном и том же скомпилированном файле, они, очевидно, будут конфликтовать
Реализация двух разных категорий
тот же метод приводит к неопределенным
поведение
Это должно быть переписано так: «Две разные категории, реализующие один и тот же метод для одного и того же класса , приводят к неопределенному поведению». Опять же, поскольку все методы для любого одного класса оказываются в одном и том же файле, наличие двух методов в одном и том же классе, очевидно, вызовет странность.
Вы можете использовать категории для предоставления методов, которые переопределяют методы суперкласса, потому что класс и его суперкласс - это два разных класса.
Если вы когда-либо не понимали, будет ли категория вызывать проблемы, просто спросите себя: «Сработали бы методы в категории, если бы я скопировал и вставил их все в файлы класса .h / .m?» Если ответ «да», то вы в чистом виде. Если «нет», значит у вас проблемы.