我已经在Singletone中保存了NSString的价值。当我想转换为int时,value是一些随机数。例如,我正在调用NSString *numberCoupons = [Manager sharedInstance].userProfile.numberOfCoupons
,po numberCoupons返回正常值: 40 。
但问题出在下一行,当我想将字符串转换为值时:int coupons = (int)numberCoupons
;它返回一些随机数等。 421414 。
可能是什么问题?
答案 0 :(得分:1)
尝试int coupons = [numberCoupons integerValue];
答案 1 :(得分:1)
numerofCoupons
显然是一个NSNumber
对象,用于在Objective-C集合类(NSArray
,NSDictionary
等)中存储数字,因为只能存储对象在他们中间。
要从对象中获取包装值,请使用:
NSInteger coupons = [numberOfCoupons integerValue]
我建议将numberOfCoupons
重新声明为NSInteger
,而不是NSNumber
,因为NSNumber
对象与它们包装的原始类型相比,操作起来既困难又昂贵。
如果值需要进入集合类,则在添加时将其包装在NSNumber
对象中,并在删除时将其解包。
答案 2 :(得分:1)
当您写(int)numberOfCoupons
时,您要求变量numberOfCoupons
中的值被强制转换到int
类型。
现在,类型NSString *
的变量中的值是对象的引用,即内存地址。当(Objective-)C转换为整数类型的引用时,您将返回内存地址。这是您看到的“随机”值。
您需要做的是向变量中的值引用的对象发送消息,请求它返回与其自身等效的整数值。 NSString
为此设置了intValue
方法,因此[numberOfCoupons intValue]
将按照您的意愿行事。
有一整套xValue
方法可以获得不同精度/大小的各种整数和浮点值。
注意:如果您引用NSNumber
而非NSString
,则完全相同的代码将起作用。
注意2:如果您确实有NSNumber
,那么您首次尝试的强制转换表达式可能会返回一个与您对内存地址的预期完全不同的值。这是因为某些整数值由特殊的标记地址表示,它们实际上并不引用真实对象。这是您通常不会注意到的优化,除非您不小心将参考值强制转换为整数...
HTH