61

NSNumber と NSInteger の違いは何ですか? 私が知っておくべきこれらのようなプリミティブは他にありますか? フロート用はありますか?

4

5 に答える 5

59

NSNumberプリミティブではなくクラスであり、生の数値を辞書や配列に入れる必要がある場合、またはカプセル化する必要がある場合に使用されます。NSIntegerNSUIntegerCGFloatなどは単純な型で、(iPhone などの 32 ビット システムでは) 、 、 に対応intunsigned intますfloat

原則として、数値をどこかに格納する必要がある場合は、 を使用しますNSNumber。計算やループなどを行う場合はNSIntegerNSUIntegerまたはを使用しますCGFloat

NSIntegerを にラップできますNSNumber:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

...そしてそれを取り戻します:

NSInteger anInteger = [aNumber integerValue];

ここで詳細情報を見つけることができます: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

于 2009-08-16T19:20:58.877 に答える
51

既存の回答は役に立ちます。それらに追加:

はい、NSUInteger正の整数の間で の 2 倍の範囲を与えますが、この 2 つを選択するもう 1 つの重要な理由は、単に負の値が単に意味をなさないNSInteger場合を区別するためだと思います。

例:NSArraycountメソッドの戻り値はNSUIntegerです。負の数の要素を持つ配列を持つことはできないため、これは理にかなっています。コーダーが符号なしであることを知っている場合、シフトなどのビットごとの操作を含む、符号付きの場合には信頼できない操作を実行する自由が増えます。 このブログ投稿では、署名されたものと署名されていないものについて詳しく説明しています。

CGFloatvsNSFloatについての私の推測(これは存在しません): NeXTStep という名前のコード要素の設計者が、時間間隔以外であまりにも多くの float 値を指定する必要がなかったのかもしれません。NSTimeIntervalそのため、浮動小数点型である が与えられましたが、これは明らかに時間間隔での使用を意図しています。そして、率直に言って、構造体を処理する必要がなく、常に数秒であることがわかっているので、その型があることは素晴らしいことです。グラフィックスの世界 (Core Graphics が住んでいる場所) に移動すると、突然、浮遊物が周囲に漂い、宙に浮いています (笑)。したがって、そこに a を導入することは理にかなってCGFloatいます。この段落はすべて「知識に基づいた憶測」です。

また、プリミティブ型の代わりに etc を使用する理由をNSInteger明確にするために、この方法を使用すると、マシン アーキテクチャを最大限に活用する移植可能なコードを簡単に作成できるためです。たとえば、CGFloat一部のマシンでは 32 ビットを使用し、他のマシンでは 64 ビットを使用しますが、これらのサイズのマシンにどれだけの効率ギャップがあるかに大きく依存します。場合によっては、32 ビットを使用した場合と 64 ビットを使用した場合では実際のスピードアップがないため、64 ビットを使用することもできます。を 'sとして宣言しCGFloatた場合、再コンパイルすると突然、追加の精度が「無料で」得られます。

そして、iKenndac が指摘したように、これらすべて (および のような他のプリミティブ型または準プリミティブ型)NSNumberのラッパー クラスであり、それをs およびsBOOLに含めたり、より簡単にアーカイブしたり、他のことを実行したりできます。できる。NSArrayNSDictionaryNSObject

于 2009-08-17T01:06:47.410 に答える
6

NSInteger はint、C の従来のようなものです。これは typedef です。、などNSUIntegerCGFloatすべてがプリミティブ型の同義語です。

NSNumber は、数値を NSArray または NSDictionary に貼り付ける必要がある場合に役立ちます。標準的な方法は、独自のコレクションではなく、これらのコレクションを使用することです。欠点は、Objective-C オブジェクトしか含めることができないことです。

NSNumber は本質的intに、配列に追加できる Obj-C オブジェクト (プリミティブ型を「ボックス化」する C#/Java の概念と同様) (または float など) をラップします。

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

パフォーマンス上の理由から、可能であればプリミティブ型 (int、float、int[] など) を使用してください。ただし、エントリをファイルに読み書きする場合など、NSArray/NSNumber を回避できない場合があり.plistます。

于 2009-08-16T19:21:44.693 に答える
0

前に他の人が言ったようにNSNumberNSObjectサブクラスです。これは C プリミティブ ( int、unsigned int、float、double など)NSIntegerではありません。C プリミティブCGFloatよりNSUInteger単純typedefsです。

の必要性はNSNumber、オブジェクトを必要とする API へのパラメーターとして数値を使用する必要性から生じます。例としては、数値を 、NSArrayコア データ内、またはNSDictionary.

私が知っておくべきこれらのようなプリミティブは他にありますか? プリミティブ型でNSNumberはなく、あらゆる種類の数値 (浮動小数点数、整数型、ブール値など) をラップします。のベースとなる NSValue についても学ぶ必要がありますNSNumber

フロート用はありますか?float の "NS" typedef はありませんが、NSNumber任意の float 番号をラップできます。

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

または、CoreGraphics プリミティブ型 CGFloat を使用することもできます。

于 2013-02-12T20:30:41.303 に答える