Преимущества:
Вы можете расширить любой класс, даже тот, для которого у вас нет источника.Посмотрите, например, на расширения пользовательского интерфейса, добавленные Apple к классу NSString
для рендеринга, получения метрик и т. Д.
Поскольку у вас есть доступ ко всем переменным экземпляра, категории предоставляюту вас есть хороший способ структурировать ваш код по блокам компиляции, используя логическую группировку вместо подхода «все должно быть в одном физическом месте», например, в Java.
Недостатки:
- Вы не можете безопасно переопределять методы, уже определенные самим классом или другой категорией.
AFAIK, языки не дают никаких гарантий относительно того, какая реализация будет фактически вызвана, если вы попробуете что-то вроде:
@interface Foo { }
- (void) method;
@end
@interface Foo (MyCategory)
- (void) method;
@end