【问题标题】:NSNumber limit?NSNumber 限制?
【发布时间】:2012-11-29 15:26:59
【问题描述】:

NSNumber 允许的最高 int 是多少?我已经在这些论坛的其他地方看到了答案,因此我对此深感困惑。

int miles = 35000;
vehicle.mileage = [NSNumber numberWithInt:miles];
NSLog(@"int value = %d", miles);
NSLog(@"mileage = %@", vehicle.mileage);

输出是:

int value = 35000
mileage = -30536

我一定是在这里遗漏了一些非常简单的东西,但是有人可以向我解释为什么它不能正常工作吗?

更新: 进一步观察后,vehicle.mileage 被正确设置为 35000,但是当我通过 NSLog(@"%@", vehicle.mileage) 显示它时,它输出不正确。当它停止工作时,我还没有找到“神奇”值,因为到目前为止,它适用于高达 ~30,000 的值。

【问题讨论】:

  • 如果您将vehicle.mileage = [NSNumber numberWithInt:miles] 替换为NSNumber *mileage = [NSNumber numberWithInt:miles],然后将NSLog(@"mileage = %@", vehicle.mileage); 更改为NSLog(@"mileage = %@", mileage);,您将得到预期的结果:mileage = 35000,所以我认为问题出在mileage vehicle 中的财产。检查它的二传手没有做一些时髦的事情。肯定是NSNumber 类型的吗?
  • 没错,肯定是NSNumber类型——@property(nonatomic,retain)NSNumber * mileage;
  • This post 提供了答案。简单的错误,但很高兴知道。

标签: objective-c ios


【解决方案1】:

NSNumber 只是一个包装器,因此当包装的原始类型溢出时它会溢出。
因此,如果您使用 numberWithInt,则允许的最大数量为 INT_MAX(在 limits.h 中定义),如果您使用 numberWithFloat,则允许的最大数量为 FLOAT_MAX,依此类推。 所以在这种情况下你不会溢出,我怀疑 INT_MAX 会这么低。

【讨论】:

    【解决方案2】:

    概述

    NSNumber 是 NSValue 的子类,它提供一个值作为任何 C 标量 (数字)类型。它定义了一组专门用于设置的方法 并将值作为有符号或无符号字符、短整数、整数访问, long int、long long int、float 或 double 或作为 BOOL。 (注意 number 对象不一定保留它们创建的类型 with.) 它还定义了一个 compare: 方法来确定排序 两个 NSNumber 对象。

    所以NSNumber 和它包裹的一样大。对于您意想不到的结果,您可以查看@sjs 的问题下方的评论。

    【讨论】:

      【解决方案3】:

      +numberWithInt: 将该值解释为有符号整数。里程永远不会是负数,所以我建议使用[NSNumber numberWithUnsignedInt:]

      【讨论】:

        【解决方案4】:

        NSNumber 整数可以具有的限制称为INT_MAX,但 35、000 远不及此。问题肯定出在vehicle 对象或vehicle 中的mileage 属性,其中任何一个都可能是nil

        所以,继续用这个条件语句记录:

        if (!vehicle) {
         NSLog(@"Vehicle is nil");
        }
        else if (!vehicle.mileage) {
         NSLog(@"Vehicle's mileage is nil");
        }
        

        告诉我你的结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          • 1970-01-01
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多