2011-12-24 76 views
1
- (UIImage*)returnRandomBackground{ 
    int selectedImage = (arc4random() % 4) + 1; 
    UIImage *imageToReturn; 
    if (selectedImage == 1) { 
     imageToReturn = Image1; 
    } 

    else if (selectedImage == 2) { 
     imageToReturn = Image2; 
    } 

    else if (selectedImage == 3) { 
     imageToReturn = Image3; 
    } 

    else if (selectedImage == 4) { 
     imageToReturn = Image4; 
    } 

    return imageToReturn; 
} 

未定義或垃圾值返回給調用者。XCode分析器報告垃圾對象

對我來說這段代碼看起來是合法的,它有什麼不對?

回答

0

編譯器會認爲有可能存在selectedImage = 5,這意味着可能存在未分配imageReturn的情況。您必須將最後的else if更改爲else,以確保始終分配imageReturn

看看代碼會如何處理selectedImage = 5。它會中斷。

+0

謝謝你這是一個很好的安全實踐,我應該堅持。還有一個如果可以去其他地方。 – Necro 2011-12-24 13:45:02

+1

順便說一下,在分配'selectedImage'之後,您還可以直接在分析器之後通過添加和斷言('assert(selectedImage <= 4)'或使用'NSAssert')直接告訴分析器。 – mrueg 2011-12-24 13:52:35

2

編譯器不夠聰明,推斷(arc4random() % 4) + 1始終在範圍[1..4]。只需將imageToReturn初始化爲空,警告即告消失。

注:如果你使用它,並在某些時候你改變的隨機數生成的模數,​​你就容易null迴歸給調用者(沒有從你的友好編譯器警告),如果你不請相應地調整您的if/else序列。
如果這不是你想要的,可以在某處使用一個斷言(可能通過添加一個「catch-all」子句並在那裏斷言)。

此外,考慮使用switch塊而不是if/else序列,這是我認爲這裏最自然的構造。

+0

這種解決方案感覺不對... – 2011-12-24 13:36:22

+0

爲什麼你覺得不對? – Mat 2011-12-24 13:37:19

+0

因爲它適用於編譯器。不要同意編譯器可能會出現一個錯誤的路徑,而是讓它閉嘴。在我看來,做編譯器告訴你的東西總是會忽略它。 – 2011-12-24 13:44:42

0

或者 - 你可以只初始化imageToReturn

UIImage *imageToReturn = nil; 

然後,無論發生什麼情況,你會不會返回垃圾值。