Если у вас нет немедленного ответа на вопрос, какой из них использовать, предпочитают функции.
Я использую функции большую часть времени (> 90%).
Методы полезны для полиморфизма и интерфейса.
Есть и другие соображения для каждого:
функции, как правило, меньше, быстрее, и компилятор имеет возможность встраивать их. Если нет причин причинять проблему с помощью метода, и вам не нужно иметь эксклюзивное использование в классе, перейдите к функции.
Способы (или категории, если хотите) удобны, если вы не хотите использовать служебные данные для доступа или хотите другую функцию, доступную в методе экземпляра, такую как @synchronized. В моих программах эти функции гораздо менее вероятны, и, как правило, нет необходимости использовать методы.
Методы экспорта дополнительных символов и, как правило, имеют более высокие (но небольшие) накладные расходы, в результате они обычно делают двоичный файл немного большим, а исполняемый файл немного медленнее (обычно не замечается, если вы не используете их часто).
Существует также риск использования/создания частных методов, поскольку получатели/подклассы могут реализовать/объявить метод. Это часто является ненужным риском. Я предпочитаю, чтобы компилятор/компоновщик сортировал это для меня, вместо того, чтобы узнать, что он поражает странный случай во время выполнения через 2 недели после отгрузки (и трудно найти проблему). Методы также могут быть полезны, если вы планируете скоро сделать интерфейс доступным.
«Существует также риск использования/создания частных методов, поскольку получатели/подклассы могут реализовать/объявить метод». Это критический атрибут методов Objective-C, который для меня подсказывает масштабы использования статических функций. У меня это случалось пару раз, и может быть больно выяснить, что происходит (особенно если у вас нет источника для одного из классов). –