2009-12-08 2 views
2

При чтении Best way to define private methods for a class in Objective-C В конечном итоге возникает сомнение в стиле программирования. Какое лучшее решение (с точки зрения стиля) для этой проблемы? Использовать категорию и объявить ее в директиве @interface в файле .m или перейти со статической функцией, получающей объект.«Частные методы» или статические функции в Objective-C. Какой из них я должен использовать?

Thanks

ответ

2

Если у вас нет немедленного ответа на вопрос, какой из них использовать, предпочитают функции.

Я использую функции большую часть времени (> 90%).

Методы полезны для полиморфизма и интерфейса.

Есть и другие соображения для каждого:

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

Способы (или категории, если хотите) удобны, если вы не хотите использовать служебные данные для доступа или хотите другую функцию, доступную в методе экземпляра, такую ​​как @synchronized. В моих программах эти функции гораздо менее вероятны, и, как правило, нет необходимости использовать методы.

Методы экспорта дополнительных символов и, как правило, имеют более высокие (но небольшие) накладные расходы, в результате они обычно делают двоичный файл немного большим, а исполняемый файл немного медленнее (обычно не замечается, если вы не используете их часто).

Существует также риск использования/создания частных методов, поскольку получатели/подклассы могут реализовать/объявить метод. Это часто является ненужным риском. Я предпочитаю, чтобы компилятор/компоновщик сортировал это для меня, вместо того, чтобы узнать, что он поражает странный случай во время выполнения через 2 недели после отгрузки (и трудно найти проблему). Методы также могут быть полезны, если вы планируете скоро сделать интерфейс доступным.

+0

«Существует также риск использования/создания частных методов, поскольку получатели/подклассы могут реализовать/объявить метод». Это критический атрибут методов Objective-C, который для меня подсказывает масштабы использования статических функций. У меня это случалось пару раз, и может быть больно выяснить, что происходит (особенно если у вас нет источника для одного из классов). –

6

Категории - это путь.

Google Objective-C Style Guide says,

Используйте категорию, чтобы предотвратить загромождение общественности заголовок.
...
Если вы используете Objective-C 2.0, вы должны вместо этого объявить свою личную категорию, используя расширение класса, например: @interface GMFoo() { ... } , который будет гарантировать, что заявленные методы реализованы в разделе @implementation путем выдачи предупреждение компилятора, если это не так.

«Расширение класса объявляется так же, как категории, но без имени»
- Class Extensions Explained

+0

+1 - Способ - это путь. Частный метод сегодня, скорее всего, будет очищен и станет публичным методом в будущем. Приготовься. – PeyloW

+0

Если вы используете расширения (которые, несмотря на мой комментарий в другом ответе, часто являются решением nicer-_looking_), я настоятельно рекомендую вам добавить уникальный уникальный префикс _really_ для имен методов, таких как полное имя класса. Таким образом, практически нет шансов, что подкласс случайно переопределит ваш «частный» метод, за исключением явного (и, вероятно, злонамеренного) намерения. –

Смежные вопросы