したがって、基本的に、これらのオブジェクトを処理するときはいつでも、それらの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];
...
変更可能なバージョンはありますか?
いいえ。