我看到了这个帖子,但想确认一下:
所以基本上任何时候你想处理这些对象都必须解包它们的 ivars,然后将它们打包成新的对象,大概是 NSNumbers?
这看起来很弱(而且背部很痛,不是吗?)。
你们如何处理这些?
你会避开它们吗?子类化它们?有可变版本吗?
处理它们似乎需要做很多工作,很想听听它们的好处和更有经验的程序员使用它们的方式,或者他们使用了什么策略来避免使用它们。
谢谢,
缺口
我看到了这个帖子,但想确认一下:
所以基本上任何时候你想处理这些对象都必须解包它们的 ivars,然后将它们打包成新的对象,大概是 NSNumbers?
这看起来很弱(而且背部很痛,不是吗?)。
你们如何处理这些?
你会避开它们吗?子类化它们?有可变版本吗?
处理它们似乎需要做很多工作,很想听听它们的好处和更有经验的程序员使用它们的方式,或者他们使用了什么策略来避免使用它们。
谢谢,
缺口
所以基本上任何时候你想处理这些对象都必须解包它们的 ivars,然后将它们打包成新的对象,大概是 NSNumbers?
是的。(顺便说一下,调用doubleValue
不仅仅意味着解包 ivar。可能还有一些转换。)
这看起来很弱(而且背部很痛,不是吗?)。
这种“装箱”是必要的,因为原始数字本身不支持Objective-C(Foundation.framework)的引用计数方案。例如,您必须将一个数字装箱NSNumber
,以便将它们存储在NSArray
.
你会避开它们吗?
你不能。
子类化它们?
您不应该,但如果必须,请按照建议的方式进行操作:
如果您只想添加一些方便的方法,例如-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];
...
有可变版本吗?
不。
当我必须对变量执行算术运算时,我会避免使用 NSNumbers。实际上,我一直避免使用它们,除非我要将它们滚动到 Core Data 或其他东西中。
既然最新版本的 clang 编译器(3.2 版本以上,Xcode 4.6 附带,也可以从源代码构建)中有 Objective-C 文字,您可以对“box”执行 @42 和 @(7+35) 之类的操作“NSNumbers。