2011-12-24 3 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 ifelseに変更して、imageReturnが常に割り当てられるようにする必要があります。

selectedImage = 5の場合、コードが何をするかを見てください。それは壊れるでしょう。

+0

ありがとうございました。私はあまりにも守ってください。それ以外の場合はどこに行くことができるのですか? – Necro

+1

また、 'selectedImage'を割り当てた直後にassertion(assert(selectedImage <= 4)'または 'NSAssert')を追加してアナライザに正しいことを伝えることもできます。 – mrueg

2

コンパイラは、(arc4random() % 4) + 1が常に[1..4]の範囲にあることを推測するほどスマートではありません。 imageToReturnをnullに初期化するだけで、警告は消えてしまいます。

注:あなたがこれを使用すると、いくつかの点であなたは乱数生成弾性率を変更した場合、あなたはドン場合(あなたの優しいコンパイラから警告なしで)呼び出し側にnull sを返しますしがちですそれに応じてあなたのif/elseシーケンスを適合させてください。
これが必要なものでない場合は、アサーションをどこかで使用してください(可能であれば、「キャッチオール」のelse句を追加してそこにアサートしてください)。

また、if/elseシーケンスの代わりにswitchブロックを使用することを検討してください。これは私の意見では最も自然な構成です。

+0

この解決策は間違っていると感じます... –

+0

なぜあなたに間違っているのですか? – Mat

+0

コンパイラを中心に動作するためです。コンパイラが間違っているパスが存在する可能性があることに同意するのではなく、シャットダウンするように指示します。私の意見では、コンパイラがあなたに言うことをすることは、常にそれを無視しています。 –

0

代わりに - あなただけ起こるものは何でも、その後imageToReturn

UIImage *imageToReturn = nil; 

を初期化することができ、あなたはゴミの値を返すことはありません。

関連する問題