2011-10-02 25 views
36

Objective-Cのint,NSIntegerNSUIntegerの主な違いは何ですか?int、NSInteger、NSUIntegerの相違点

アプリケーションで使用する方が良い理由は何ですか?あなたは右クリックして[定義に行くかもしれないような場合には

+0

「NSInt」のようなものはありません。 – BoltClock

+0

NSInteger NSInt .. – Hitarth

+2

[ドキュメントを参照](http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html) – Jiri

答えて

29

#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 
+0

ok thanx iそれを得た – Hitarth

+0

簡単で正確な –

20

は違いが抽象型のためのものであり、彼らの仲間はハードウェアからなサイズ。現在intの大きさやポインターの大きさを特定のハードウェア上で心配する必要はありません。

"C"はこれが悪いですが、longが少なくともintと同じくらい大きいことを述べるだけで、intはハードウェアの "自然な"整数サイズであり、intは少なくとも短期間(大きな混乱)に限ります。

これは、Fortranから来るときには良い考えのようでしたが、うまくいきませんでした。

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

Appleが戻り値の型をNSUIntegerとして定義していれば、それはあなたのハードウェアに合わせて16,32,64ビットのサイズかどうかを知る必要はありません。 (私は例のためだけにそれらの値を空中で選んだ)。

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

ドキュメントは「質問の手紙」に答えていますが、「なぜ」についての理解はできていませんか?

+0

あなたは右。私たちはそれらの違いだけを得るが、なぜですか?私はまだ私を提案していない私は – Hitarth

+3

それはAPIの標準化です。これらのフレームワークは複数のアーキテクチャーに搭載されています.APIがすべて同じアーキテクチャーになっていると良いでしょう。これらのtypedefを持つことで、AppleはAPIコンシューマからのプラットフォームの違いを抽象化しています。これらのタイプに関してAPIにしか話していないのであれば、(理論的に)i386、x86_64、ppc、arm7などの同じコードをコンパイルするときに、プラットフォームの違いについて考える必要はありません。それは抽象です。仕事を終わらせる最高レベルの抽象化を使用すべきだと言われています。だからあなたがこれらのタイプを使用しない理由がない限り、私はそれらを使用すると言います。 – ipmcc