ios – 在Objective C中使用静态init时的优点?

最近我发现了 webrtc-ios example from 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) { ... }

解决方法

使用静态函数和Objective-C方法一个区别是
静态函数不能在子类中覆盖.如果共同的init代码完成
一个
- (void)setup;

方法和VideoView的子类MyVideoView恰好实现了一个名称相同的方法

[[MyVideoView alloc] initWithFrame:..]

调用子类实现,这可能不需要.

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

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

-(void)commonVideoViewSetup;

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...