NSNumber 与 Int
Posted
技术标签:
【中文标题】NSNumber 与 Int【英文标题】:NSNumber vs Int 【发布时间】:2011-07-12 10:24:44 【问题描述】:如果整数不能写入字典,然后写入 .plist,但 NSNumbers 可以在整个应用程序中使用 NSNumbers,而不是每次都需要转换保存或从 .plist 加载字典,会更好吗?
【问题讨论】:
请注意,内存分配是昂贵的。您可能希望自己的类类似于 NSNumber 是可变的。 首选NSInteger
而不是int
。这在不同版本的 OS X 中更便携。
您可以简单地将NSNumber
(对象)替换为int
(“标量值”)。将每个数字量保存在 NSNumber
中并为每次计算转换从/到是非常尴尬的。另一方面,使用NSInteger
而不是int
是合理的做法。
【参考方案1】:
概括地说:只要坚持使用 POD 类型,直到您需要使用基于对象的表示,例如 NSNumber
。 POD 的性能要好得多,但在某些情况下您需要NSNumber
。
在某些情况下,改用NSNumber
可能是有意义的——这通常是当你重复使用 NSNumber
经常——这是为了避免产生大量重复的@987654326 @s。除了序列化和通用 objc 接口(绑定、转换器、字典)之外,这种情况很少发生。
更新/详细信息:ObjC 运行时在某些情况下,在某些架构和某些操作系统版本上会替换一个标记指针,代表特定类型的NSNumber
s和域。尽管自几年前最初编写以来内部表示已经改变,但这里是对该主题的一个很好的介绍:http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in。在可以使用它的地方,它使您免于诸如分配、锁定和引用计数操作之类的缓慢操作。尽管如此,标记指针无法表示每个数字,并且会引入开销,因此您仍应优先使用基本内置函数而不是 NSNumber
作为默认值。标记指针在适用的情况下是一个很好的优化,但当您只需要一个 数字 时,它与内置函数相去甚远。
【讨论】:
很棒的是KVC支持自动装箱,即标量类型和NSNumber之间的转换,所以在属性中几乎不需要使用NSNumber。 考虑到 64 位设备的影响,您可能需要修改此内容。【参考方案2】:NSNumber 是继承自 NSValue 包装对象的对象。
int 不是对象。
如果使用 NSNumber,你可以获得越来越多的功能来使用它们。
http://developer..com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html
NSNumber 是一个帮助您将数字类型存储为对象的类。它具有在不同类型之间转换的方法和检索数值的字符串表示形式的方法。 如果您像在示例中那样使用类型为 NSNumber* 的变量 day,那么您不会修改 day 的值,而是修改它的内存地址。
【讨论】:
【参考方案3】:这一切都取决于您的需要。但是,如果 API 要求您使用 int,则应使用 int。它要求你使用 NSNumber 你应该使用 NSNumber。
例如,如果您正在使用 UISegmentedControl,并且想要选择一个段,那么,
[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here
// or
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];
【讨论】:
以上是关于NSNumber 与 Int的主要内容,如果未能解决你的问题,请参考以下文章
Object - C 值对象 NSNumber和NSValue