14

重複の可能性:
NSIntegerとintをいつ使用するか?
NSIntegerがあるのはなぜですか?

交換可能intに使用できますか?使用する代わりに、NSInteger使用するだけの特定の状況はありますか?NSIntegerint

4

2 に答える 2

20

int と NSInteger を交換可能に使用できますか?

いいえ。Apple が使用する LP64 アーキテクチャでは、最新の OS X Cocoa の場合、NSInteger は 64 ビット幅です。これは、NSInteger を int にキャストすると、NSNotFound との比較失敗する可能性があることを意味します。次に例を示します。

NSRange theRange = [@"foo" rangeOfString @"x"];
int location = theRange.location;
if (location == NSNotFound) // comparison is broken due to truncation in line above
{
    // x not in foo
}

私の意見ではNSInteger、パラメータを Cocoa に渡すか、Cocoa から結果を受け取る必要があり、ドキュメントにデータ型がNSInteger. その他の場合:

  • 型の幅を気にしない場合は、C の型 (例:intまたは) を使用しlongます。
  • 型の幅が気になる場合は、C99 型を使用しstdint.hint32_tくださいint64_t
  • ポインターを保持するのに十分な大きさが保証された int が必要な場合は、intptr_tまたはを使用しますuintptr_t
于 2011-05-19T10:08:32.257 に答える
2

ポインタサイズの整数には、標準のC99uintptr_tを使用すると思います。NSIntegerの定義は十分に曇っているように見えますが、ポインターを保持することが保証されているかどうかはわかりません。

必要に応じて、APIが使用するNSIntegerを使用します。しかし、長いことはすべての実用的な目的のためになります。

NSObjCRunTimeを見ると、現在の定義の動機はあまりわかりません。おそらく、たとえばNSArray内のアイテムの最大数に達するのに十分な大きさの整数型を持っているでしょうか?

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
于 2011-05-19T10:17:22.630 に答える