Ios 在目标C中使用静态init的好处?
最近我发现。当我浏览这个项目时,我注意到VideoView类使用静态方法,我不确定这是否必要。 VideoView是UIView的子类,它覆盖两个init方法,Ios 在目标C中使用静态init的好处?,ios,objective-c,webrtc,Ios,Objective C,Webrtc,最近我发现。当我浏览这个项目时,我注意到VideoView类使用静态方法,我不确定这是否必要。 VideoView是UIView的子类,它覆盖两个init方法,initWithFrame:和initWithCoder:。我知道重写那些init方法然后使用一些方法来设置其他东西是正常的,比如-(void)setup 但是VideoView类使用静态函数,静态void init(VideoView*self)。问题是使用静态函数和普通ObjC方法相比有什么好处 VideoView类中的代码如下所示:
initWithFrame:
和initWithCoder:
。我知道重写那些init方法然后使用一些方法来设置其他东西是正常的,比如-(void)setup代码>
但是VideoView类使用静态函数,静态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方法之间的一个区别是
不能在子类中重写静态函数。如果完成了公共初始化代码
在一个
方法,并且VideoView
的子类MyVideoView
碰巧实现了一个同名的方法,然后
[[MyVideoView alloc] initWithFrame:..]
将调用可能不需要的子类实现
在代码中,
initWithFrame
/initWithCoder
将始终调用本地init()
函数,即使
初始化子类的实例
如果公共初始化是在一个方法中完成的,那么方法名应该更大
例如,为了避免被“意外”覆盖,请指定
-(void)commonVideoViewSetup;
我认为这会被认为是不好的做法。看起来有人试图把C++构造(我猜)变成Objto-C.我第一次看到这种方法时感到困惑,因为我看不到在这里使用静态函数的任何要求。我仍然认为开发者有他这样做的理由。
-(void)commonVideoViewSetup;