2009-08-16 62 views

答えて

50

既存の回答は便利です。彼らに追加​​:

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

例:NSArraycountメソッドの戻り値は、我々は要素の負の数の配列を持つことができないので、理にかなってNSUInteger、です。符号器が符号なしであることを知っている場合、符号化されたケースでは、シフトなどのビット演算を含む信頼性の低い演算を実行する自由度が高くなります。 This blog postは、署名されたものと署名されていないものについて詳しく述べています。

私の推測についてCGFloat(存在しない)NSFloat対:それはNeXTStepの名前のコード要素の設計者は、単に時間の外に、あまりにも多くの浮動小数点値を指定する必要はありませんでした場合であるかもしれません間隔。だから彼らはNSTimeIntervalを与えました。これは浮動小数点型ですが、それは明らかに時間間隔での使用を意図しています。そして、率直に言って、あなたが構造体を扱うことなく常に秒単位であることが分かっているので、その型を持つことは素晴らしいことです。あなたがグラフィックスの世界(コアグラフィックスが暮らす場所)に移動すると、突然浮かんであなたの周りが空中に浮かんでいきます(笑)。したがって、CGFloatを導入することは意味があります。この段落はすべて「教育された推測」です。また

、ちょうどなぜあなたは代わりに、プリミティブ型NSIntegerなどを使用する場合がありますについて明確にするために:この方法は、それはマシンアーキテクチャを最大限に活用し、移植可能なコードを書くことが容易だからです。たとえば、CGFloatは、一部のマシンでは32ビット、他のマシンでは64ビットを使用します。これらのマシンでは、効率ギャップの大きさに大きく依存します。場合によっては、32ビットと64ビットを使用するための実際の高速化がないため、64ビットを使用することもできます。 CGFloatのものを宣言した場合、再コンパイルすると、その余分な精度が「無料」で突然取得されます。 iKenndacが指摘したよう

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

+0

本当に、本当にうなずいている点: NSTimeintervalはdouble型であり、float型ではありません。 doubleは倍精度浮動小数点の略ですが、それでもなおわかります。 また、私はCGFloatのコンパイルが64ビットの倍精度であることを理解していますが、NSIntegerですか?私はそれが役に立つと思う状況を考えることができません。コードでは64ビットが必要な数学をやっていると言ってください... 32ビットでコンパイルするとNSIntegerを使うことはできません。32ビットに収まるなら、64ビットを使うのはなぜですか?奇妙に思える。 – iKenndac

+1

あなたはそうです、NSTimeIntervalはダブルです。私はそれがまだ "浮動小数点型"と考えています。ちょうど倍精度で。 また、多くの場合、NSIntegerを64ビットにすることで多くのコードが改善されないことに同意します。しかし、ここに一つの可能​​性があります:乱数ジェネレータ。この場合、スピードは本当に気になるので、速ければ32ビットを使いたいかもしれません。しかし、64ビットもうまく動作すれば、(もしあれば)速度コストがあまり無ければ、突然ランダムな幸福(長いサイクル長さなど)で突然大きなブーストが得られます。 – Tyler

+0

なぜ我々は一度投票できますか?ブリリアント! –

56

NSNumberは、プリミティブではなくクラスであり、生の数字を辞書や配列などに入れてカプセル化する必要がある場合に使用されます。 NSIntegerNSUIntegerCGFloatなどはシンプルなタイプで、int,unsigned intfloatに対応しています(iPhoneのような32-btシステム)。

数字をどこかに保存する必要がある場合は、通常、NSNumberを使用します。計算やループなどを行う場合は、NSIntegerNSUIntegerまたはCGFloatを使用してください。

あなたがラップすることができNSIntegerNSNumberへ:

NSNumber *aNumber = [NSNumber numberWithInteger:21]; 

...そして、それを取り戻す:http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

+0

数値が負ではない場合は、NSUIntegerを使用する必要がありますか? – mk12

+0

そして、10進数の数字にはどの数字を使用しますか? – mk12

+0

NSFloatではなくCGFloatはなぜですか? – mk12

5

NSIntegerは次のとおりです。

NSInteger anInteger = [aNumber integerValue]; 

現在地の詳細情報を見つけることができます伝統的なintのCと同じように、typedefです。 NSUIntegerCGFloatなどのように、すべてがプリミティブ型の同義語です。

NSNumberは、NSArrayまたはNSDictionaryに番号を付ける必要がある場合に便利です。標準的なプラクティスは、これらのコレクションを使用することと独自のものを使用することです。欠点はObjective-Cオブジェクトのみを含むことができるということです。

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

のNSNumberは、本質的に、アレイに添加することができる(プリミティブ型「ボクシング」のC#/ Javaの概念に類似)は、obj-Cオブジェクトにint(またはフロートなど)ラップ

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

+1

NSInteger、NSUInteger、およびCGFloatは32ビットまたは64ビットで安全なtypedefです。 – Abizern

0

これまでに他人によって言われたように、NSNumberNSObjectサブクラスである。これはCプリミティブではありません(int、unsigned int、float、doubleなどNSIntegerCGFloatNSUIntegerはCプリミティブ上で単純ですtypedefsです。

NSNumberの必要性は、オブジェクトを必要とするAPIのパラメータとして数値を使用する必要があるために発生します。例は、NSArray、In Core-Data、またはNSDictionaryに数値を格納する場合です。

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

フロート用に1つありますか?そこフロートには、「NS」のtypedefはありませんが、NSNumberは任意の浮動小数点数の周りをラップすることができます:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926]; 

それとも、CoreGraphicsにプリミティブ型CGFloatを使用することができます。

2

のNSNumberは、一般的に変数を格納するために使用される、NSUIntegerは、あなたがこれを行うことにより、NSUIntegerへのNSNumberを変更することができます算術

のために使用されます。

それは前にしかし、原則として言われてきた

NSNumber *variable = @1; 
NSUInteger variableInt = [variable unsignedIntegerValue]; 
*で定義する必要がある変数はObjective Cのクラスですが、*を必要としない変数はCのプリミティブです。

関連する問題