Категории предназначены для добавления методов к классам, источник которых вам недоступен, например, ко всем классам Apple (начинающимся с NS, CG, CA и т. Д.), Без необходимости их подкласса.
Цель протоколов - определить методы, которые должны реализовывать классы, придерживающиеся этого протокола. В Java они называются интерфейсами. Цель состоит в том, чтобы систематизировать сходства между классами, которые не являются братьями и сестрами (подклассы одного и того же суперкласса). Предположим, у вас есть класс Chair
и класс Petrol
. Они не имеют много общего, за исключением того, что они оба придерживаются протокола flammable
, который требует от них определенных методов, таких как specificEnergy
и flamingPoint
.
Теперь у вашего Fire
класса может быть метод addFlammableMaterial:(id <flammable>)material
.
Протоколы часто используются для объявления того, что экземпляры определенных классов могут быть делегатами для некоторых других экземпляров. Вы можете объявить свой контроллер представления как источник данных для UITableView
, заявив, что он соответствует протоколу UITableViewDataSource
, что означает, что ваш viewController гарантирует, что он реализует необходимые методы этого протокола, и tableView может безопасно отдыхать потому что он может доверять ВК как своему источнику данных.