2015-08-28 34 views
2

我想在調用[super init]之前在派生對象中設置成員變量。 我能找到的就是你不應該做這樣的事情。無論如何,我的工作無疑是有效的,但實際上我很想知道在遵守規則時會產生什麼後果。如果有正確的方法來處理這個問題,甚至會更好。在[super init]之前執行某些操作objective-c

的詳細信息:

我有綁定一個C幾個包裝++對象到一個Objective-C objec(主要是UI ...查看或UI ...控制器)

@interface my_scrollview : UIScrollView 
{ 
    my_c_class* m_p; 
} 
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap; 
-(void) setContentOffset:(CGPoint)contentOffset; 
@end 
@implementation dwin_scrollview_ios 
-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap 
{ 
    m_p = pWrap; // illegal but works? 
    return [super initWithFrame: frame]; 
    //m_p = pWrap; // to late because [super init...] already called overriden func. 
} 

在我重寫setContentOffset-method我需要訪問我的C++ - Object。 問題出現是因爲initWithFrame使用setContentOffset內部初始化其內容。所以這個方法在我可以「legaly」建立到我的C++對象的鏈接之前被調用。

如果設置了m_p,我可以通過檢查來實現我的覆蓋(幸運的是它被初始化爲零)。但是我必須在init方法之後同步視圖的狀態和我的C++對象。在這個例子中,這沒有什麼大不了,但其他這樣的實現要複雜得多,而且我最終得到了很多重複初始化步驟的代碼,或者以其他方式使我重新同步,儘管在[super init ...]之前我知道我同步。

有沒有一種模式來解決這個正確的(和優雅的)?

在調用[super init ..];之前int指針真的很糟糕嗎?

(我假設一個後果是,這種崩潰,如果[超級初始化]返回nil ...?任何其他情況下?)提前

感謝 莫里茨

+0

也許我錯過了什麼,但爲什麼這是非法的? Swift鼓勵這種初始化。 –

+0

例如。蘋果文檔:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization。html#// apple_ref/doc/uid/TP40010810-CH6-SW58我發現了其他的文檔可以說是相同的,但是沒有人會告訴我們這是一個經驗法則還是爲什麼你不能這麼做...... – moritz

+0

https:// developer。 apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW58 – moritz

回答

2

有什麼魔力在Objective-初始化方法C。 alloc返回所需類的對象,並將所有實例變量初始化爲0/nil/NULL/0.0等。然後,每個init方法只執行開發人員編寫的代碼。

有些東西顯然是愚蠢的,比如設置超類的實例變量,然後調用[super init],並立即覆蓋它。你需要知道,init不一定會返回self,而是一個不同的對象,在這種情況下,在調用[super init]之前,你在基類中初始化的所有東西都將消失。

-1

您正在使用錯誤的init

試試這個:

-(id) initWithFrame:(CGRect)frame wrapper: (my_scrollview*) pWrap 
{ 
    self = [super initWithFrame: frame]; 
    if (self) { 
     m_p = pWrap; 
    } 
    return self; 
} 
+0

'my_scrollview * scroll = [[my_scrollview alloc] initWithframe:.. ..]。 [scroll setContentOffset:....] ' – AleyRobotics

+1

問題是,當initWithFrame調用其他成員方法(例如setContentOffset) – moritz

0
// illegal but works? 

不,這不違法。儘管非常規,在它的超類初始化程序運行之前,它對一個對象做東西是完全合法的。它可能仍然會導致意想不到的行爲和錯誤,但它本身並不是非法的。有時甚至有必要,例如當你想執行一些計算並將計算結果委託給超類的初始化器時。

+0

時,我希望m_p已經有效。那麼爲什麼downvote? –

相關問題