private методы в Objective-C

Когда я только начал работать с Objective-C, мне очень не нравился тот факт, что в этом языке нет возможности объявить какой-либо метод класса приватным. Это действительно доставляет большое количество неудобств, т.к. пользователю класса приходится разбираться с большим количеством методов используемых для внутренних целей класса и совершенно ему не нужных.
Несмотря на то, что не существует никакого способа запретить вызов метода класса, спрятать описание лишних методов от пользователя все же есть. Для этого необходимо воспользоваться такой замечательной фичей как категории. Категории позволяют добавить новые методы к уже существующему классу.
Исходный код будет выглядеть приблизительно так. В заголовочном файле описываются методы интересные конечному пользователю:

@interface TestClass : NSObject
{}
- (void)publicFunc;

А файле реализации добавляются новые “закрытые” методы. Хотя эти методы и не видны пользователю через заголовчный файл, они могут быть вызваны наравне с описанными в заголовке.

@interface TestClass (PrivateMethods)
- (void) privateFunc;
@end


@implementation TestClass
- (void)publicFunc
{
    NSLog(@"publicFunc");
    [self privateFunc];
}
- (void)privateFunc
{
    NSLog(@"privateFunc");
}

Хотя это и не совсем то, что private/protected в C++, но уж лучше так..

2 Comments private методы в Objective-C

  1. binski

    Использовать категории для получения “почти private” методов, это не избыточное ли решение? По-моему, вполне достаточно будет просто не объявлять такие методы в заголовочном файле, только реализовать их в .m файле.

    Reply
    1. Alexander Stavonin

      Тоже вариант. Скорей всего эти два метода дадут несколько разный бинарный код, но в целом согласен.

      Reply

Leave a Reply