int 不从 NSString 返回相同的值

int not returning same value from NSString

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

尝试int coupons = [numberCoupons integerValue];

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

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

 NSInteger coupons = [numberOfCoupons integerValue]

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

如果该值需要进入集合 class 然后在添加它时将其包装在 NSNumber 对象中并在删除它时解开它。

当你写 (int)numberOfCoupons 时,你要求变量 numberOfCoupons 中的 valuecast 到类型 int.

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

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

有一整套 xValue 方法来获取不同 precision/size 的各种整数和浮点值。

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

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

HTH