348

NSIntegeriOS 向けの開発では、どのような場合に vs. int を使用する必要がありますか? 値を引数として関数に渡したり、関数から値を返したりするときにNSInteger(または)使用する Apple サンプル コードを確認します。NSUInteger

- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...

しかし、関数内ではint、値を追跡するために使用しているだけです

for (int i; i < something; i++)
...

int something;
something += somethingElseThatsAnInt;
...

NSInteger64ビットまたは32ビット環境で整数を参照する安全な方法であると読んだ(言われた)のに、なぜ使用intするのですか?

4

8 に答える 8

323

通常NSInteger、コードが実行されるプロセッサ アーキテクチャの種類がわからない場合に使用します。そのため、何らかの理由で可能な限り最大の整数型が必要になる場合があります。これは、32 ビット システムでは単なる ですがint、64ビット システムではシステムlongです。

特に必要でない限り、 /NSIntegerの代わりに使用することに固執します。intlong

NSInteger/は、これらの型のいずれかにNSUInteger*dynamic * として定義され、次のように定義されます。typedef

#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

これらの型ごとに使用する必要がある正しい書式指定子については、プラットフォーム依存関係に関する String Programming Guide のセクションを参照してください。

于 2010-12-14T23:06:54.703 に答える
44

なぜintまったく使用するのですか?

Apple が使用するのはint、for ループ制御変数 (ループの繰り返しを制御するためにのみ使用される) のintデータ型は、データ型のサイズとループで保持できる値の両方で問題ないためです。ここでは、プラットフォームに依存するデータ型は必要ありません。ループ制御変数の場合、ほとんどの場合、16 ビットでも十分intです。

Apple はNSInteger、関数の戻り値または関数の引数に使用します。この場合、データ型 [サイズ] が重要です。関数で行っていることは、他のプログラムまたは他のコードとデータを通信/渡しているためです。NSInteger vs int を使用する必要があるのはいつですか?への回答を参照してください。あなたの質問自体で...

[Apple] は、値を引数として関数に渡したり、関数から値を返したりするときにNSInteger (または NSUInteger) を使用します。

于 2011-03-16T02:22:36.147 に答える
32

OS Xは「LP64」です。この意味は:

int常に 32 ビットです。

long longは常に 64 ビットです。

NSInteger常にポインタlongサイズです。つまり、32 ビット システムでは 32 ビット、64 ビット システムでは 64 ビットです。

NSInteger が存在する理由は、多くのレガシー APIがポインター サイズの変数を保持するint代わりに誤って使用されたためです。つまり、 64 ビット バージョンでは API を からに変更する必要がありました。つまり、API は、32 ビットまたは 64 ビット アーキテクチャ用にコンパイルしているかどうかに応じて、異なる関数シグネチャを持ちます。 は、これらのレガシー API でこの問題を隠すつもりです。longintlongNSInteger

新しいコードでint、32 ビット変数long longが必要な場合、64 ビット整数が必要な場合、longまたはNSIntegerポインター サイズの変数が必要な場合に使用します。

于 2010-12-14T23:50:33.230 に答える
26

NSInteger の実装を掘り下げると、次のようになります。

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

簡単に言えば、NSInteger typedef が 1 つのステップを実行します。アーキテクチャが 32 ビットの場合は を使用しint、64 ビットの場合は を使用しますlong。NSInteger を使用すると、プログラムが実行されているアーキテクチャについて心配する必要はありません。

于 2010-12-14T23:10:24.940 に答える
11

NSNotFound や NSIntegerMax などの定数値と比較する必要がある場合は、NSInteger を使用する必要があります。これらの値は 32 ビット システムと 64 ビット システムで異なるため、インデックス値、カウントなどには NSInteger または NSUInteger を使用してください。

2 倍のメモリを消費することを除いて、ほとんどの状況で NSInteger を使用しても害はありません。メモリへの影響は非常に小さいですが、一度に膨大な量の数値が浮かんでいる場合は、int を使用すると違いが生じる可能性があります。

NSInteger または NSUInteger を使用する場合は、フォーマット文字列を使用するときに、長整数または符号なし長整数にキャストする必要があります。これは、NSInteger を既知の長さであるかのようにログアウトしようとすると、新しい Xcode 機能が警告を返すためです。プロセスで精度が失われる可能性があるため、int 型の変数または引数にそれらを送信する場合も同様に注意する必要があります。

全体として、一度に何十万もメモリに格納することを想定していない場合は、NSInteger と NSInteger の違いを常に気にするよりも、NSInteger を使用する方が簡単です。

于 2014-03-14T13:00:26.903 に答える
10

intiOSでは、現在、またはを使用するかどうかは関係ありませんNSInteger。iOSが64ビットに移行するかどうか/いつ移行するかはさらに重要になります。

簡単に言うと、NSIntegersはint32ビットコード(したがって32ビット長)ではs、64ビットコードではslongです(long64ビットコードではsは64ビット幅ですが、32ビットコードでは32ビットです)。NSIntegerの代わりにを使用する最も可能性の高い理由longは、既存の32ビットコード(intsを使用)を壊さないためです。

CGFloat同じ問題があります:32ビット(少なくともOS Xでは)では、それはfloat; 64ビットではdouble

更新: iPhone 5s、iPad Air、Retinaを搭載したiPad Mini、およびiOS 7の導入により、iOSで64ビットコードをビルドできるようになりました。

アップデート2:また、NSIntegersを使用すると、Swiftコードの相互運用性が向上します。

于 2013-01-14T02:15:43.097 に答える