1

ここに数行のコードがあります... currentPage は NSInteger で、imageViewHolder は NSMutableArray です。

    NSLog(@"currentPage: %d, imageViewHolderCount: %d", currentPage, [imageViewHolder count]);
    if(currentPage < [imageViewHolder count] - 1)       
    {
        NSLog(@"%d < %d - 1", currentPage, [imageViewHolder count]);
        tempView = [imageViewHolder objectAtIndex:currentPage + 1];
        NSLog(@"doesn't get here, crashed.");   //this doesn't get logged because of crash.

        //do other stuff here
    }

インデックスが範囲外であるため、「tempView = ...」行でクラッシュしています。これは私が得ている出力です:

currentPage: 0, imageViewHolderCount: 0
0 < 0 - 1
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
*** First throw call stack:
(0x339bd88f 0x324af259 0x339069db 0x48f1b 0x48c1b 0x35603a85 0x35603409 0x35602c57 0x35716b0f 0x3560424d 0x4abfb 0x324ab175 0x43f77 0x45b91 0x479a7 0x36bff 0x285ed 0x35604ecb 0x32935933 0x33991a33 0x33991699 0x3399026f 0x339134a5 0x3391336d 0x32e91439 0x35608e7d 0xfa01 0xf9c0)

明らかな何かが欠けていると確信しています... ifステートメントがtrueと評価されるのはなぜですか? 0が実際には-1より大きいことはかなり確信しています:)

4

3 に答える 3

5

問題は、それcount符号なしの型であることです。符号なしゼロから​​減算すると、ではなく1非常に大きな正の数1-1になります。

問題を回避するために、条件を加算を使用する同等の式に置き換えます。

if((currentPage+1) < [imageViewHolder count]) ...


1最近のほとんどのコンピューターで負数を表すために使用される2 の補数表現の値は-1、完全に 1 で構成される 2 進数です。この数値が符号なし 32 ビット値として再解釈されると、 になります。2^32-1

于 2012-08-29T15:29:25.120 に答える
2

はい。ただし、0 は MAX_INT よりもはるかに小さい値です。符号なし整数を使用しています (これが MAX_INT として定義されているかどうか、またはたまたま MAX_INT である未定義の動作であるかどうかについて、標準を再確認する必要がありますが、どちらの場合も、あなたが意味するものではありません)。コンパイラの出力を見ると、この効果に対する警告があると思います (ObjC コードで警告を許可しないでください)。

unsigned long 0 < -1?も参照してください。

于 2012-08-29T15:30:53.457 に答える
0

これはロングショットです...しかし、次のように条件を書いてみてください:

(currentPage < ([imageViewHolder count] - 1))

おそらく問題は、コンパイラがこのようにグループ化していることです

((currentPage < [imageViewHolder count]) - 1)

(0 < 0) は false (0) を返し、次に 1 を減算し、0 とは異なる -1 のままであるため、true を返します。

于 2012-08-29T15:28:23.653 に答える