Насколько безопасны категории Objective-C? - PullRequest
4 голосов
/ 20 февраля 2010

Категории Objective-C чрезвычайно полезны, но с этой способностью есть некоторые проблемы. Они приходят в основном в двух формах, о которых я знаю:

  • Две категории пытаются добавить один и тот же удобный метод. В этом случае не определено, какой из них используется. Если вы будете осторожны - не добавляйте слишком много методов или не используйте наиболее распространенные имена методов - первая проблема почти никогда не должна быть проблемой.
  • Новые методы, добавляемые в класс автором, конфликтующим с категорией. В этом случае категория переопределяет метод класса. Так как урок может быть не под моим контролем, я больше беспокоюсь об этой проблеме.

Backporting изменения должны быть довольно безопасными, но реализация интерфейсов или добавление удобных методов кажутся более опасными. Я знаю, что какао, кажется, довольно часто использует его для удобства, но опять же базовый класс находится под его контролем. Я думаю, что, возможно, они просто используют категории для уменьшения зависимостей - поэтому у класса String могут быть удобные методы для работы в Какао, но если вы не используете Какао, он не включается.

Итак, насколько безопасны категории / какие существуют инструкции по их сохранности?

Ответы [ 2 ]

6 голосов
/ 20 февраля 2010

Обычно при расширении кода, не находящегося под вашим контролем (например, Foundation), традиционно используется префикс или суффикс в имени метода, чтобы избежать подобных коллизий.

Пример из Исполнение Питера Хоси в категории основного потока :

@interface NSObject (PRHPerformOnMainThread)
- (id) performOnMainThread_PRH;
@end

Это не самое красивое решение, но если вы беспокоитесь о хрупкости, это хорошая идея.

4 голосов
/ 20 февраля 2010

Я нашел Руководство по стилю Google Objective-C полезным, и оно содержит соглашение, помогающее избежать упомянутых вами столкновений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...