web-dev-qa-db-ja.com

int、NSInteger、NSUIntegerの違い

Objective-CのintNSIntegerNSUIntegerの主な違いは何ですか?

アプリケーションで使用する方が良いのはなぜですか?

36
Hitarth

このような場合、右クリックして定義に移動することができます。

#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
29
Bastian

違いは、ハードウェアからサイズが設定された抽象型とそのアソシエイトです。これで、特定のハードウェアでintのサイズやポインタの大きさを気にする必要がなくなりました。

"C"はこの点で問題があり、longは少なくともintと同じ大きさであり、intはハードウェアの「自然な」整数サイズ(つまり、何であれ)であり、intは少なくとも短い-(大きな混乱)。

これは、Fortranから来た当時は良い考えのように思われましたが、あまり熟成しませんでした。

Uint32_t、int16_tなどのPOSIX定義を使用することもできます。ただし、これは、特定のハードウェア上でポインタをどれだけ大きくする必要があるかについては触れていません。

したがって、Appleが戻り値の型をNSUIntegerとして定義している場合は、それを使用するだけで、特定のハードウェアのサイズが16、32、または64ビットであるかどうかを知る必要はありません。(例として、これらの値を空中で選択しました)。

@Bastianで確認できるように、実際のサイズはハードウェアによって異なります。

ドキュメントは「質問の手紙」に答えますが、「なぜ」の理解を提供しませんか?

20
zaph