我想在調用[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 ...?任何其他情況下?)提前
感謝 莫里茨
也許我錯過了什麼,但爲什麼這是非法的? Swift鼓勵這種初始化。 –
例如。蘋果文檔:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization。html#// apple_ref/doc/uid/TP40010810-CH6-SW58我發現了其他的文檔可以說是相同的,但是沒有人會告訴我們這是一個經驗法則還是爲什麼你不能這麼做...... – moritz
https:// developer。 apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Initialization/Initialization.html#//apple_ref/doc/uid/TP40010810-CH6-SW58 – moritz