NSInteger
/NSUInteger
は、通常の組み込み型の Cocoa 定義の置換です。
ビルトインよりも NS* 型を使用する利点はありますか? どちらが好きですか、なぜですか? とは 32 ビット / 64 ビット プラットフォームで同じ幅NSInteger
ですか?int
NSInteger
/NSUInteger
は、通常の組み込み型の Cocoa 定義の置換です。
ビルトインよりも NS* 型を使用する利点はありますか? どちらが好きですか、なぜですか? とは 32 ビット / 64 ビット プラットフォームで同じ幅NSInteger
ですか?int
私がそれを理解する方法は、NSInteger et al。対応する C 型のアーキテクチャ セーフ バージョンです。基本的にそれらのサイズはアーキテクチャによって異なりますが、たとえば NSInteger は現在のアーキテクチャの有効なポインタを保持することが保証されています。
Apple は、これらを使用して OS X 10.5 以降で作業することをお勧めします。Apple の API:s はそれらを使用するため、これらを使用する習慣を身につけることは間違いなく良い考えです。もう少しタイピングが必要ですが、それを除けば、それらを使用しない理由はないようです。
状況によっては、代わりに標準型を使用する正当な理由がある場合がありますNSInteger
。64 ビット システムでの「予期しない」メモリの肥大化。
明らかに、整数が 4 バイトではなく 8 バイトの場合、値が使用するメモリ量は 2 倍になります。ただし、すべての値が整数であるとは限らないため、通常、アプリケーションのメモリ フットプリントが 2 倍になるとは考えないでください。ただし、Mac OS X がメモリを割り当てる方法は、要求されたメモリの量によって異なります。
現在、512 バイト以下を要求するmalloc
と、次の 16 バイトの倍数に切り上げられます。ただし、512 バイトを超える値を要求すると、malloc
512 の次の倍数 (少なくとも 1024 バイト) に切り上げられます。次に、特に 5 つのNSInteger
インスタンス変数を宣言するクラスを定義し、32 ビット システムでは各インスタンスが 272 バイトを占めるとします。64 ビット システムでは、インスタンスには理論上 544 バイトが必要です。ただし、メモリ割り当て戦略により、実際にはそれぞれが 1024 バイトを占有します (ほぼ 4 倍の増加)。これらのオブジェクトを多数使用すると、アプリケーションのメモリ フットプリントが予想よりもかなり大きくなる可能性があります。NSInteger
変数を変数に置き換えた場合sint_32
、512 バイトしか使用しません。
したがって、使用するスカラーを選択するときは、適切なものを選択してください。32 ビット アプリケーションで必要な値よりも大きな値が必要な理由はありますか? 64 ビット整数を使用して秒数をカウントする必要はほとんどありません...
64 ビットは、実際には NSInteger と NSUInteger の存在理由です。10.5 より前では、それらは存在しませんでした。この 2 つは、単純に 64 ビットでは long として定義され、32 ビットでは int として定義されます。
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
したがって、「ビットネイティブ」サイズが必要な場合は、より基本的な C 型の代わりにそれらを使用します。
私は標準のcスタイルの宣言を好みますが、それは私がいくつかの言語を切り替えて、それについてあまり考える必要がないという理由だけですが、nsintegerを見始めるべきだと思われます
ファイルまたはネット経由でデータをインポートおよびエクスポートするには、UInt32、SInt64などを使用します...
これらは、アーキテクチャに関係なく一定のサイズであることが保証されており、これらの型を共有する他のプラットフォームや言語にコードを移植するのに役立ちます。