在Objective C中使用静态初始化的好处?

最近我发现了Github的webrtc-ios例子 。 虽然我浏览项目时,我注意到,VideoView类使用静态方法,我不知道是否有必要。 VideoView是UIView的子类,它覆盖了两个init方法initWithFrame:initWithCoder: 我知道这是正常的重写这些初始化方法,然后使用一些方法来设置其他的东西,如- (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) { ... } 

使用静态函数和Objective-C方法之间的一个区别是静态函数不能在子类中被覆盖。 如果通用的init代码是在a中完成的

 - (void)setup; 

方法,然后VideoView一个子类MyVideoView碰巧实现了一个同名的方法

 [[MyVideoView alloc] initWithFrame:..] 

将调用可能不需要的子类实现。

在你的代码中, initWithFrame / initWithCoder将总是调用本地的init()函数,即使子类的一个实例被初始化。

如果通常的初始化是在一个方法中完成的,那么方法名称应该更加具体,以避免它被“意外”覆盖

 -(void)commonVideoViewSetup;