2014-05-08 50 views
12

最近我發現了webrtc-ios example from Github。當我瀏覽項目時,我注意到VideoView類使用靜態方法,我不確定是否需要。 VideoView是UIView的子類,它覆蓋了兩個初始化方法,initWithFrame:initWithCoder:。我知道覆蓋這些init方法是正常的,然後使用一些方法來設置其他東西,如- (void)setup;在Objective C中使用靜態初始化的好處?

但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) { ... } 
+0

我認爲這將被認爲是不好的做法。它看起來像有人試圖將C++構造(我猜測)轉化爲objective-c。 – TechZen

+0

我第一次看到這種方法時感到困惑,因爲我沒有看到在這裏使用靜態函數的任何要求。儘管如此,我仍然認爲開發者有他的理由爲什麼他這樣做。 –

回答

15

一個使用靜態函數和一個Objective-C方法之間的區別是 靜態函數不能在子類中被重寫。如果通用初始化代碼在

- (void)setup; 

方法來完成 和子類的VideoViewMyVideoView恰好實現與同名的方法,那麼

[[MyVideoView alloc] initWithFrame:..] 

將調用子類實現,這可能不需要。

在你的代碼, initWithFrame/initWithCoder總是會調用本地init()功能,即使 一個子類的實例初始化。

如果通用的初始化是在方法完成,則該方法的名稱應該是更 具體,以避免它被重寫「意外」,例如

-(void)commonVideoViewSetup; 
+0

這是一個合理的解釋,謝謝! –