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 中存储数字(NSArray
、NSDictionary
等),因为它们只能存储对象。
要从对象中获取包装值,请使用:
NSInteger coupons = [numberOfCoupons integerValue]
我建议将 numberOfCoupons
重新声明为 NSInteger
,而不是 NSNumber
,因为与它们包装的原始类型相比,NSNumber
对象的操作既困难又昂贵。
如果该值需要进入集合 class 然后在添加它时将其包装在 NSNumber
对象中并在删除它时解开它。
当你写 (int)numberOfCoupons
时,你要求变量 numberOfCoupons
中的 value 被 cast 到类型 int
.
现在NSString *
类型变量中的值是对对象的引用,即内存地址。当 (Objective-)C 将引用转换为整数类型时,您会取回内存地址。这是您看到的“随机”值。
您需要做的是向变量中的值 引用的对象发送一条消息,请求它return 一个与自身等价的整数值。 NSString
有一个方法 intValue
可以做到这一点,所以 [numberOfCoupons intValue]
会做你想做的事。
有一整套 xValue
方法来获取不同 precision/size 的各种整数和浮点值。
注意:如果您引用的是 NSNumber
,而不是 NSString
,则完全相同的代码将起作用。
注意 2:如果您确实有一个 NSNumber
,那么您第一次尝试的强制转换表达式可能 return 一个值,其大小与您对内存地址的预期完全不同。这是因为一些整数值由特殊的 标记地址 表示,它们实际上并不引用真实对象。这是您通常不会注意到的优化,除非您不小心将参考值转换为整数...
HTH
我已将 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 中存储数字(NSArray
、NSDictionary
等),因为它们只能存储对象。
要从对象中获取包装值,请使用:
NSInteger coupons = [numberOfCoupons integerValue]
我建议将 numberOfCoupons
重新声明为 NSInteger
,而不是 NSNumber
,因为与它们包装的原始类型相比,NSNumber
对象的操作既困难又昂贵。
如果该值需要进入集合 class 然后在添加它时将其包装在 NSNumber
对象中并在删除它时解开它。
当你写 (int)numberOfCoupons
时,你要求变量 numberOfCoupons
中的 value 被 cast 到类型 int
.
现在NSString *
类型变量中的值是对对象的引用,即内存地址。当 (Objective-)C 将引用转换为整数类型时,您会取回内存地址。这是您看到的“随机”值。
您需要做的是向变量中的值 引用的对象发送一条消息,请求它return 一个与自身等价的整数值。 NSString
有一个方法 intValue
可以做到这一点,所以 [numberOfCoupons intValue]
会做你想做的事。
有一整套 xValue
方法来获取不同 precision/size 的各种整数和浮点值。
注意:如果您引用的是 NSNumber
,而不是 NSString
,则完全相同的代码将起作用。
注意 2:如果您确实有一个 NSNumber
,那么您第一次尝试的强制转换表达式可能 return 一个值,其大小与您对内存地址的预期完全不同。这是因为一些整数值由特殊的 标记地址 表示,它们实际上并不引用真实对象。这是您通常不会注意到的优化,除非您不小心将参考值转换为整数...
HTH