在NSNumber中包装双倍有什么显着的好处吗?

时间:2015-08-11 08:28:13

标签: objective-c cocoa

我正在编写一大堆代码,根据类的配置方式执行一些繁重的数学运算。我目前在内部到处都使用双打,因为它们为我所做的事情提供了足够的精确度。

最初,我写了大部分方法,尽可能接受双打作为参数,主要是为了保持代码清洁。但是,这些相同的方法返回NSNumber对象,因为我使用nil来检查方法是否实际返回了有效值(在某些情况下,代码可能遇到非致命错误并返回nil)。 / p>

所以我的典型代码看起来像这样:

MyMathClass *mathClass = [[MyMathClass alloc] init];

NSNumber *result = [mathClass doSomethingProfound:1234.0];

if (result == nil) {
    // handle failure gracefully
} else {
    NSLog(@"the number times 100 is %f", [result doubleValue] * 100);
}

但是,我并不完全清楚我为什么要在NSNumber类中包装所有东西以便返回。这在当时似乎是一个好主意,但在math.h中挖掘使我发现了NAN和isnan()宏,我可以使用它直接返回一个double(没有中间的NSNumber对象)并检测成功或相应失败。

所以,相反,我的代码看起来像这样:

MyMathClass *mathClass = [[MyMathClass alloc] init];

double result = [mathClass doSomethingProfound:1234.0];

if (isnan(result)) {
    // handle failure gracefully
} else {
    NSLog(@"the number times 100 is %f", result * 100);
}

除了稍微简化一些事情并减少我匆匆忙忙的对象数量外,编写像这样依赖NAN和isnan()的代码来检测失败(而不是返回对象)是否有任何严重的缺点并检查无)?

1 个答案:

答案 0 :(得分:1)

NSNumber对象根本不用于数学,但是对于需要将数字存储为对象的情况。例如各种集合类; NSArrayNSSet ;所有人都管理对象集合,以便在希望将数字放入其中一个集合时使用NSNumber个对象。

对于数学,只需使用普通的数字数据类型; doubleintCGFloat(一种基本浮点类型的框架定义别名), et al 。您正在使用NSNumber浪费内存,时间甚至精确度(可能会发生类型转换)。

HTH

相关问题