Преимущества при использовании статического init в Objective C?

Недавно я обнаружил пример webrtc-ios от Github. Пока я просматривал проект, я заметил, что класс VideoView использует статический метод, и я не уверен, что это необходимо или нет. VideoView является подклассом UIView и переопределяет два метода init, initWithFrame: и initWithCoder:. Я знаю, что это нормально, чтобы переопределить эти методы init, а затем использовать некоторый метод для настройки другого материала, например - (void)setup;.

Но класс VideoView использует статическую функцию, static void init(VideoView *self). Вопрос в том, есть ли преимущества при использовании статической функции против обычного метода ObjC?

Код в классе VideoView выглядит следующим образом:

-(id)initWithFrame:(CGRect)frame {

     if (self = [super initWithFrame:frame]) {
         init(self);
     }
     return self; 
}

-(id)initWithCoder:(NSCoder *)aDecoder {

     if (self = [super initWithCoder:aDecoder]) {
         init(self);
     }
     return self; 
}

 static void init(VideoView *self) { ... }

Ответ 1

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

- (void)setup;

а подкласс MyVideoView of VideoView реализует метод с тем же именем, затем

[[MyVideoView alloc] initWithFrame:..]

вызовет реализацию подкласса, которая может не понадобиться.

В вашем коде, initWithFrame/initWithCoder всегда будет вызывать локальную функцию init(), даже если инициализируется экземпляр подкласса.

Если обычная инициализация выполняется в методе, то имя метода должно быть больше чтобы избежать чрезмерной "случайности", например,

-(void)commonVideoViewSetup;