3

我看到了这个帖子,但想确认一下:

如何为计算目的转换 NSNumber 对象?

所以基本上任何时候你想处理这些对象都必须解包它们的 ivars,然后将它们打包成新的对象,大概是 NSNumbers?

这看起来很弱(而且背部很痛,不是吗?)。

你们如何处理这些?

你会避开它们吗?子类化它们?有可变版本吗?

处理它们似乎需要做很多工作,很想听听它们的好处和更有经验的程序员使用它们的方式,或者他们使用了什么策略来避免使用它们。

谢谢,

缺口

4

3 回答 3

6

所以基本上任何时候你想处理这些对象都必须解包它们的 ivars,然后将它们打包成新的对象,大概是 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 文字,您可以对“box”执行 @42 和 @(7+35) 之类的操作“NSNumbers。

于 2012-11-21T22:02:59.660 回答