2011-11-10 45 views
5

我對此問了一個類似的問題,但我仍然無法看到問題?Obj-,當'self'未設置爲[[(super或self)init ...]的結果時使用的實例變量''

-(id)initWithKeyPadType: (int)value 
{ 
    [self setKeyPadType:value]; 
    self = [self init]; 
    if(self != nil) 
    { 
     //self.intKeyPadType = value; 

    } 
    return self; 
} 

- (id)init { 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                   autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 
.... 

的警告來自上述Instance variable used while 'self' is not set to the result of '[(super or self) init...]'

+1

如果我理解正確的代碼,您使用的是變量調用[超級初始化],這可以爛攤子你的內存分配 –

+0

他不叫超初始化任何地方 – jrturton

回答

4

你在做什麼在技術上沒問題,但是在某個階段你需要調用[super init]。如果您的班級的init方法執行了其他initWith...方法使用的大量通用初始化,請將您的[super init]放在那裏。另外,在嘗試使用實例變量之前,一定要確保該類已經被使用了init

- (id) initWithKeyPadType: (int)value 
{ 
    self = [self init]; // invoke common initialisation 
    if(self != nil) 
    { 
     [self setKeyPadType:value]; 
    } 
    return self; 
} 

- (id) init 
{ 
    self = [super init]; // invoke NSObject initialisation (or whoever superclass is) 
    if (!self) return nil; 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                  autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 

    ... 
+0

您能否詳細說明海灣合作委員會警告指出的實際風險?假設對象內存的調零發生在alloc時間(我認爲是正確的),似乎只有@public或@protected ivar纔有可能被超類的init方法破壞,因此需要警告。我想不出爲什麼這種警告對於私人伊維爾來說是有用的,除了風格上,這通常不是編制者的擔憂。 –

+0

@quixoto:+ alloc會將內存清零。我不知道爲什麼它很重要......這可能與調用'[super init]'可能返回'nil',如果它確實返回'[sub init]''方法也應該返回'nil'。除此之外,我不知道海灣合作委員會會關心的原因。 – dreamlax

2

行警告說話是算數的。您正在分配decimalSymbol,這是一個實例變量,但此時沒有實例。你需要一個

self = [super init]; 

在init方法的開始。在某一時刻,對象必須被創建,在某些時候,這必須回調NSObject(通過一系列超級入口)。

+3

這是一個小強說「沒有之前實例「。 'alloc'應該已經創建了實例。問題是這個實例可能沒有被正確初始化(因爲'init'就是這樣)。 – Chuck

+0

好的,是的。沒有「工作」實例? – jrturton

相關問題