Преимущества при использовании статического 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;