0

この質問には、私が今までに理解していたはずの非常に単純な答えがあると確信しています。私はまだ行っていないのであなたのところに来ます、スタックオーバーフローの集合精神。

以下のループでは、0から5までの数値が出力されると予想していました。代わりに、0と4のみが出力されます。LoopNumber++がNSNumber LoopNumberを1ではなく4だけインクリメントするのはなぜですか?

NSNumber *LoopNumber;
for (LoopNumber=0; LoopNumber<=5; LoopNumber++) {
    NSLog(@"%d",LoopNumber);
}

次のように変更すると、期待どおりに動作します。何が得られますか?

for (int LoopNumber=0; LoopNumber<=5; LoopNumber++) {

SDK3.1.2を使用してXCode3.2.1のiPhoneプロジェクトをいじっています。

4

2 に答える 2

4

NSNumberは整数ではありません。これは、整数の場合がある数値のオブジェクトラッパーです。

変数LoopNumberは、実際には、オブジェクトがあるべきメモリ内の場所へのポインタです。LoopNumber自体が保持するのはメモリアドレスだけで、マシン上では4バイトの長さです。LoopNumber ++を実行すると、ポインターにアリマティックなポインターが呼び出され、4バイト後の次のメモリアドレスに進みます。これは、sizeof(LoopNumber)を実行することで確認できます。これにより、システムで4が返されます。

あなたが本当にやりたいのは、次のような通常の整数を使用することです。

NSUInteger loopNumber;
for(loopNumber = 0; loopNumber <= 5; loopNumber++) {
  NSLog(@"%d",loopnumber);
}

または、本当にNSNumbersを使用する必要がある場合:

NSNumber loopNumber;
for(loopNumber = [NSNumber numberWithInt:0]; [loopNumber intValue] <= 5; loopNumber=[NSNumber numberWithInt:[loopNumber intValue]++]) {
  NSLog(@"%d",loopnumber);
}
于 2010-12-24T06:36:22.933 に答える
0

intはネイティブ型です。NSNumberはObjective-Cクラスです。実際の作業を行うときは、floatまたはintを使用してください。ただし、intをコレクションに入れるには、intまたはfloatのネイティブ型からNSNumberオブジェクトを作成できます。

于 2010-12-24T06:33:35.130 に答える