6
NSUInteger index = [self.objects indexOfObject:obj];

if (index == NSNotFound) {
    // Success! Note: NSNotFound internally uses NSIntegerMax
}

if (index == NSUIntegerMax) {
    // Fails!
}

なんで?indexOfObject の結果として符号なしの値を取得するとします。したがって、当然、オブジェクトが見つからない場合は、NSIntegerMax ではなく NSUIntegerMax が返されると想定していました。これはバグですか、それともこの動作には論理的な説明がありますか。

4

3 に答える 3

7

おそらくNSNotFound、 を使用するコンテキストで使用できますNSIntegerNSIntegerまた、誰かが index をではなくとして宣言した場合にも安全ですNSUInteger

せいぜい、NSNotFoundとして定義されているのは奇妙だと言えますが、それはNSIntegerMax確かにバグではありません。

于 2011-07-05T11:17:04.017 に答える
2

あなたの仮定はちょうど間違っています。これが現在または将来何であれNSNotFound、を返します。また、プラットフォームによって簡単に異なる場合があります(つまり、32ビットと64ビット)。

その存在の理由はそれを使用することです。同じかもしれない他の定数を使用することに騙されないでください。

于 2011-07-05T11:19:05.030 に答える
0

が署名されている間、 AnNSUIntegerは署名されていません(「U」)NSInteger

符号なし整数と符号付き整数の値を引き続き比較できます。NSNotFoundが実際にNSUIntegerMaxと等しいと仮定するのは、おそらく間違いです。実際、NSObjCRuntime.hではNSIntegerMaxと等しいと定義されています。

于 2011-07-05T11:19:29.747 に答える