如果您知道某个Integer需要在其生命周期的至少一个点中用作对象,那么它应该从一开始就被声明并用作NSNumber
吗?
我知道应该使用原始数据类型进行计算,所以你说[NSNumber numberWithInteger: myInt]
。但是,如果90%的时间只需要基本数据类型,那么其他10%是否有理由创建NSNumber
并且不断使用[NSNumber intValue]
来检索原语?尽可能长时间地坚持原语或者NSNumber
的OO优势是否超过那些?
作为Objective C的新手,我也很好奇最佳实践是什么 - 来自Ruby和PHP等语言不会发生这种情况。
答案 0 :(得分:3)
NSNumber
有点罕见。当然不是闻所未闻,但有点罕见。如果您有疑问,可以使用NSInteger
。我编写了整个大型程序,但没有单NSNumber
个。
NSNumber
最常见的用途是,您希望将其放入NSArray
,NSDictionary
或将其序列化(例如转换为NSUserDefaults
)。大多数情况下,数字只是某个其他对象的属性,如NSInteger
。
答案 1 :(得分:3)
我的建议是使用原始类型,除非值会在集合中花费大量时间(NSArray,NSDictionary等)。 @(myInt)
语法非常简洁,因为那时你需要一个NSNumber。
我要记住的一个例外是当你需要知道值是否曾被初始化时。在这种情况下,除非你有一个明确的“未初始化”值(例如零,NSNotFound,-1等),否则使用设置为nil的NSNumber可以轻松,确定地告诉你的内容。
答案 2 :(得分:2)
基本上,请不要使用NSNumber
,除非您当前需要。{/ p>
如果您使用的某个API需要NSNumber
,请按需生成这些NSNumber
个实例。基本上,只要有可能,就可以使用原语进行计算,存储信息,甚至使用API(例如公共类属性)。
答案 3 :(得分:0)
在Objective-C中,你可以完成C的大部分工作,所以当然,如果你不需要对对象做一些事情,你总是可以使用原始类型直到得到想要的结果。然后,如果要将其插入NSArray或在UILabel或其他内容中显示,请将其传输到NSNumber。
由于32bit / 64bit的不同,NSInteger是int / long的组合,像float这样的其他原始类型对此没有任何问题,所以只有一个特殊的OC版原始类型NSInteger。NSNumber和原始类型就像Java中的Integer vs int一样。你需要原始类型来做算术,而NSNumber需要对它的对象情况和内存空间进行操作。他们不能做另一方的工作。