3

このスレッドを見ましたが、確認したかったのです:

計算目的で NSNumber オブジェクトを変換する方法は?

基本的に、これらのオブジェクトを処理したいときはいつでも、ivar をアンパックしてから、それらを新しいオブジェクト (おそらく NSNumbers) にパックし直さなければなりませんか?

それはかなり弱いようです(そして、裏側に大きな痛みがありますか?)。

皆さんはこれらをどのように扱っていますか?

それらを避けますか?それらをサブクラス化しますか?可変バージョンはありますか?

これは、それらに対処するための多くの作業のように思えます。それらの利点と、より経験豊富なプログラマーがそれらを使用した方法、またはそれらを使用しないために使用した戦術を聞きたいです.

ありがとう、

ニック

4

3 に答える 3

6

したがって、基本的に、これらのオブジェクトを処理するときはいつでも、それらのivarを解凍してから、新しいオブジェクト(おそらくNSNumbers)にパックして戻す必要がありますか?

はい。(ちなみに、呼び出しdoubleValueは単にivarを解凍することを意味するのではありません。おそらくいくつかの変換もあります。)

それはヘラー弱いようです(そして裏側に大きな痛みがありますね?)。

この「ボクシング」が必要なのは、プリミティブ番号自体がObjective-C(Foundation.framework)の参照カウントスキームをサポートしていないためです。たとえば、番号をNSNumberに保存するには、番号をボックス化する必要がありNSArrayます。

あなたはそれらを避けますか?

できません。

それらをサブクラス化しますか?

すべきではありませんが、必要な場合は、提案されている方法に従ってください。

  • 他のクラスクラスターと同様に、NSNumberのサブクラスを作成する場合は、そのスーパークラスであるNSValueのプリミティブメソッドをオーバーライドする必要があります。さらに、非プリミティブメソッドの抽象実装を利用するために、NSValueメソッドobjCTypeの実装が返すことができる戻り値の制限されたセットがあります。有効な戻り値は、「c」、「C」、「s」、「S」、「i」、「I」、「l」、「L」、「q」、「Q」、「f」、および「d」。

必要なのがいくつかの便利なメソッドを追加することだけである場合、たとえば-numberByAddingNumber:カテゴリを使用します。

@implementation NSNumber (MyExtension)
-(NSNumber*)numberByAddingNumber:(NSNumber*)another {
   double myVal = [self doubleValue];
   double anotherVal = [another doubleValue];
   return [NSNumber numberWithDouble:myVal + anotherVal];
}
@end
...
NSNumber* a, *b;
...
NSNumber* c = [a numberByAddingNumber:b];
...

変更可能なバージョンはありますか?

いいえ。

于 2010-01-12T18:50:12.213 に答える
3

変数に対して算術演算を実行する必要がある場合は、NSNumbers を避けます。実際、私はそれらを Core Data などに転用する予定がない限り、常にそれらを避けています。

于 2010-01-12T18:48:19.817 に答える
2

最新バージョンのclangコンパイラ(バージョン3.2以降、Xcode 4.6に付属し、ソースからビルドすることもできます)にObjective-Cリテラルが含まれるようになったので、@ 42や@(7 + 35)などを"boxに実行できます。 "NSNumbers。

于 2012-11-21T22:02:59.660 に答える