2013-10-15 6 views
19

treehouseのチュートリアルに続いて、XCodeでこの人気のあるObject-C警告メッセージが表示されます。目的c暗黙の変換で整数精度 'NSUInteger'が失われる

マイボタン機能

- (IBAction)buttonPressed:(UIButton *)sender { 
    NSUInteger index = arc4random_uniform(predictionArray.count); 
    self.predictionLabel.text = [predictionArray objectAtIndex:index]; 
} 

は、私は同様のstackoverflowsのいくつかの少数きた、NSUIntegerライン上でそれを見ると、彼らは、64ビットの番号とタイプキャスト対32ビットの話をするように見えるが、方法がわかりませんここでそれをする?

マイpredictionArray

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    predictionArray = [[NSArray alloc] initWithObjects: 
        @"It is certain", @"It is decidely so", @"All signs say YES", @"The stars are not aligned", 
        @"My reply is no", 
        @"It is doubtful", 
        @"Better not tell you now", 
        @"Concentrate and ask again", 
        @"Unable to answer now", nil]; 
// Do any additional setup after loading the view, typically from a nib. 
} 

enter image description here

答えて

67

あなたは安全にキャストとの警告を抑制することができます。

NSUInteger index = arc4random_uniform((uint32_t) predictionArray.count); 

それは警告を抑制するために、あなたは運転が安全であるかどうかを把握するまで、警告を取り除くために、物事をキャスト行かない安全常にではありません。

NSUIntegerは、ご使用のプラットフォームでは、64ビット整数型のtypedefです。一部のプラットフォームでは、は常に 64ビットではありません。コンパイラは、これらのビットのいくつかが捨てられることを警告しています。これらのビットが重要でないことがわかっている場合は、ただキャストを使うことができます。

この場合、indexは常に2 -1になります。 predictionArrayにリモートで2 以上の要素が含まれている場合でも、プログラムにエラーがあり、arc4random_uniform()の64ビット版を構築する必要があります。 arc4random_uniform()がでとり、戻り、u_int32_t、関係なく、常にターゲットアーキテクチャの32ビットで、符号なし整数、私のコメントを1として

assert(predictionArray.count <= (uint32_t) -1); 
+0

ええと、私はこれを試しましたが、それと同じ警告です。ではNSUIntegerをどのようにキャストしていますか? '(NSUInteger)はどういう意味ですか?あるいはもっと重要なことは、私に警告するのは何ですか? –

+0

@LeonGaban:キャストを間違った場所に置いています。 –

+0

ありがとう!これをまだ理解しようとしているので、 'NSUInteger'は常に32ビットintですか?私は64ビットとしてキャストしようとし、同じエラーが発生しました。そのビットのものは私には新しく、決してそれにぶつかる必要はありません –

11

:あなたは、次のコードでこれを確保することができます。ただし、predictionArray.countは、NSUIntegerを返します。これは、32ビットシステムと64ビットシステムで異なるtypedef dです。 32ビットシステムでは32ビット(unsigned int)、64ビットシステムでは64ビット(unsigned long)です。 64ビットシステムで実行している場合、32ビット整数を期待する関数に64ビットのNSUIntegerを渡すと、コンパイラはビットを捨てていると不満を持ちます。

+0

説明をお寄せいただきありがとうございます。したがって、私が32ビットの数値を64ビットの関数/メソッドに送ると、プログラムが遅くなりますか?それとも、私がより効率的になることができるということだけです。 'arc4random_uniform()'の64ビット版はありますか?あるいは 'u_int32_t'をたくさん使うべきですか? –

+1

@LeonGaban気にならないほどの金額。あなたの32ビット数は64ビットに拡張する必要があります。署名されていない場合は自動的に0で拡張され、署名されていれば負の場合は1で拡張されます。それは本当に問題ではありません。しかし、32ビット関数に64ビットの数値を渡そうとすると、数値の一部がスローされてしまいます(この関数は32ビットしか得られません)。コンパイラーは不平を言いますあなたがキャストでやっていることをあなたが知っていることを保証する)。 –

+0

@LeonGaban残念ながら、 'arc4random *'関数の64ビット版はありませんが、それらにキャストしておけば大丈夫です。 'u_int32_t'はどこからでも使用することをお勧めします。なぜなら、それは定義上32ビットであるからです。 'NSUInteger'は、あなたがいつもそれを使用して、あなたが効率的にやっていることを知ることができるように、Appleがターゲットプラットフォームに合うようにあなたのために' typedef'dされているという利点があります。(あなたはあなたのサイズを任意に制限したくありません。データが理にかなっていて必要でない限り)。 –

関連する問題