Протокол - это ТОЛЬКО определение интерфейса.
Категория (против NSObject) является как определением интерфейса, так и реализацией этого интерфейса, который наследуются всеми подклассами (из NSObject), если они не переопределяют методы категории.
Хотя в прошлом Apple предпочитала определять неофициальные протоколы путем создания категорий против NSObject, это не означает, что один является определением другого.
Тот факт, что вы можете наполовину определить категорию, объявив интерфейс, но фактически не реализуя его, должен (в справедливом и справедливом мире) вызывать ошибки компиляции, поскольку компилятор Objective-C определенно жалуется на «неполную реализацию для реальных интерфейсов. Но они подвергались жестокому обращению достаточно долго, поэтому можно ожидать, что поведение не изменится.