В Objective-C на самом деле не существует «частного метода», если среда выполнения может определить, какая реализация его использует. Но это не значит, что нет методов, которые не являются частью документированного интерфейса. Для этих методов я думаю, что категория хорошо. Вместо того, чтобы помещать @interface
в верхнюю часть файла .m, как ваш пункт 2, я бы поместил его в свой собственный файл .h. Соглашение, которому я следую (и видел в другом месте, я думаю, что это соглашение Apple, поскольку XCode теперь обеспечивает его автоматическую поддержку), заключается в том, чтобы называть такой файл после его класса и категории с +, разделяющим их, так что @interface GLObject (PrivateMethods)
можно найти в GLObject+PrivateMethods.h
. Причина предоставления файла заголовка заключается в том, что вы можете импортировать его в свои классы модульного теста: -).
Кстати, что касается реализации / определения методов в конце файла .m, вы можете сделать это с категорией, реализовав категорию в нижней части файла .m:
@implementation GLObject(PrivateMethods)
- (void)secretFeature;
@end
или с расширением класса (то, что вы называете «пустой категорией»), просто определите эти методы последними. Методы Objective-C могут быть определены и использованы в любом порядке в реализации, поэтому ничто не мешает вам помещать «приватные» методы в конец файла.
Даже с расширениями классов я часто создаю отдельный заголовок (GLObject+Extension.h
), чтобы при необходимости использовать эти методы, имитируя видимость «друг» или «защищенный».
Поскольку этот ответ был изначально написан, компилятор clang начал делать два прохода для методов Objective-C. Это означает, что вы можете избежать полного объявления ваших «приватных» методов, и независимо от того, находятся они выше или ниже вызывающего сайта, они будут найдены компилятором.