2011-05-07 42 views
5

爲了美觀起見,我決定改變這一點:?爲什麼((自我= [超級的init])的工作,但((自我= [超級的init]))不

if ((self = [super init])) { 
    // init self 
} 
return self; 

到這一點:。

if (!(self = [super init])) return nil; 
// init self 
return self; 

從理論上講,他們做同樣的事情,第一個是經典的方式,只要作品調試第二個,我發現,它幾乎工作的「如果」做對, init代碼也是,但是在返回「self」之後,調試器返回「if」並返回nil!

我用第二個類創建的所有類我正在恢復使用「正確」的方式,因爲它們以nil啓動,但我真的想知道爲什麼它的行爲如此!恐怕這可能是其他問題的結果!

+0

如果在Xcode 4中發生這種情況,那麼原因是調試器只是在ObjC方法中大肆渲染和跳轉。 – JustSid 2011-05-07 12:59:17

+0

這不是隻有調試器的行爲。它真的返回「無」給調用者。噢,並且調用init代碼(包括一些「NSLog」我放在那裏:) – 2011-05-07 13:02:55

+0

@Eduardo Costa:好的,那麼不要介意我的評論 – JustSid 2011-05-07 13:03:43

回答

3

除了美學偏好之外,你的兩個版本之間絕對沒有區別,所以別的東西一定會出問題。也許你應該發佈你的整個init方法?

+0

這個類是一個有很多相互依賴的樹節點。我將需要發佈我的整個項目以使其有用。但我相信發生了某種緩衝區溢出,因爲我無法在簡單的測試中重現它。順便說一句,它沒有解釋爲什麼外部錯誤使我的init代碼運行,然後返回零! – 2011-05-08 15:21:31

+0

@Eduardo如果您不提供更多信息,那麼不太可能有人能夠猜出您的代碼出了什麼問題。 – 2011-05-08 15:59:11

+0

@Bavarious是的,我知道。正如我所說,我猜想發生了一些緩衝區溢出 - 並不能解釋「無返回」,但我用這種技術創建了新類,並且它按照需要工作。我將這個答案標記爲「正確」,因爲我會認爲「別的東西一定會出錯」。 – 2011-05-10 02:36:19

1

我創建了一個測試類這一點,有以下init方法:

- (id)init 
{ 
    if (!(self = [super init])) return nil; 
    [self setText:@"foo"]; 
    return self; 
} 

它初始化預期,並且我可以訪問text屬性。正如尼克指出的那樣,其他事情一定會發生故障。

相關問題