【问题标题】:int not returning same value from NSStringint 没有从 NSString 返回相同的值
【发布时间】:2015-06-25 14:13:41
【问题描述】:

我已将 Singletone 中的值保存为 NSString。当我想转换为 int 时,value 是一些随机数。比如我调用NSString *numberCoupons = [Manager sharedInstance].userProfile.numberOfCoupons,po numberCoupons 返回正常值:40
但问题出在下一行,当我想将字符串转换为值时:int coupons = (int)numberCoupons;它正在返回一些随机数等。421414
可能是什么问题?

【问题讨论】:

    标签: ios objective-c nsstring int


    【解决方案1】:

    试试int coupons = [numberCoupons integerValue];

    【讨论】:

    • 是的,这是有效的。这两个转换器的主要区别是什么?
    • (int)numberCoupons 用于类型转换。
    【解决方案2】:

    numerofCoupons 显然是一个 NSNumber 对象,用于在 Objective-C 集合类(NSArrayNSDictionary 等)中存储数字,因为其中只能存储对象。

    要从对象中获取包装的值,请使用:

     NSInteger coupons = [numberOfCoupons integerValue]
    

    我建议将numberOfCoupons 重新声明为NSInteger,而不是NSNumber,因为与它们包装的原始类型相比,NSNumber 对象操作起来困难且昂贵。

    如果值需要进入集合类,则在添加时将其包装在 NSNumber 对象中,并在删除时将其解包。

    【讨论】:

    • NSNumber 包装实际上并不太宽泛,大多数时候你不会注意到。正如你提到的,它们很容易进入收藏品。最大的优点是它们实际上可以为零,尽管根据设计和上下文,这也可能是一个缺点。 :)
    • @Eiko 我不同意。即使将1 添加到包裹在NSNumber 对象中的值也意味着发送一些消息并分配一个新对象。如果你经常这样做,你可能会注意到。
    • 不一定要创建新实例。 NSNumber 共享/重用/缓存实例,这很容易,因为它是不可变的。当然,我不会将它用于数字运算,但没有理由否认它们的好处,并且 userProfile.numberOfCoupons 的给定问题看起来像一个典型的存储应用程序 - 这绝对不像数字运算。并且数据可能已经被包装了。如果它并不重要(这很容易出现在仪器中),请不要迷失在微优化中。
    • 好吧,我在这里根本看不到他们的好处;只有0 to lots 的优惠券,所以不需要nil,这似乎是它优于NSUInteger 的唯一好处,直到它需要存储在一个集合类中。因此,这不是一种优化,而是大多数程序员选择表示优惠券数量的自然方式。
    • 谢谢!很好的解释。
    【解决方案3】:

    当您编写(int)numberOfCoupons 时,您要求将变量numberOfCoupons 中的 强制转换 类型为int

    现在NSString * 类型变量中的值是对对象的引用,即内存地址。当 (Objective-)C 将引用转换为整数类型时,您将返回内存地址。这是您看到的“随机”值。

    您需要做的是向变量中的值所引用的对象发送一条消息,要求它返回一个与其自身等效的整数值。 NSString 有一个 intValue 方法,所以 [numberOfCoupons intValue] 会做你想做的事。

    有一整套xValue 方法可以获取不同精度/大小的各种整数和浮点值。

    注意:如果您引用的是NSNumber,而不是NSString,那么完全相同的代码将起作用。

    注意 2:如果您确实有 NSNumber,那么您第一次尝试的强制转换表达式可能会返回一个与您预期的内存地址完全不同的值。这是因为某些整数值由特殊的标记地址表示,它们实际上并不引用真实对象。这是您通常不会注意到的优化,除非您不小心将引用值转换为整数...

    HTH

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多