NSNumber与Int的区别

10

如果整数无法写入字典再到.plist,但NSNumbers可以写入,那么在整个应用程序中都使用NSNumbers是否比需要在保存或加载字典时每次进行转换更好?


请注意,内存分配是昂贵的。您可能希望创建一个类似于NSNumber的可变类。 - user142019
建议使用NSInteger而不是int。这可以在各个版本的OS X中更好地实现可移植性。 - mouviciel
你不能简单地用一个 NSNumber(一个对象)替换一个 int(一个“标量值”)。将每个数字数量都保留在 NSNumber 中并为每个计算转换会非常笨拙。另一方面,使用 NSInteger 而不是 int 是一个合理的做法。 - Hot Licks
3个回答

8
作为概括:在你需要使用基于对象的表示形式(例如NSNumber)之前,只需坚持使用POD类型。 POD的性能更好,但在某些情况下,您需要NSNumber。
在某些情况下,使用NSNumber可能更有意义--这通常是当您经常重用NSNumber时 - 这是为了避免制作大量重复的NSNumbers。除了序列化和通用的objc接口(绑定,转换器,字典),此类情况很少实际发生。
< p > 更新/详细信息:ObjC运行时在某些情况下、某些架构和某些操作系统版本上会替换表示特定类型和域的NSNumber标记指针。虽然内部表示方式自几年前撰写以来已经改变,但这里有一个关于该主题的良好介绍:http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in。在适用的情况下,它可以避免像分配、锁定和引用计数操作这样的缓慢操作。然而,标记指针无法表示每个数字,并且会引入额外开销,因此您仍应将基本内置函数视为默认值,而不是NSNumber。标记指针是一种很好的优化方法,但当您只需要一个数字时,它远远不能与内置函数竞争。


1
很棒的是,KVC支持自动装箱,即标量类型和NSNumber之间的转换,因此在属性中几乎不需要使用NSNumber。 - DrMickeyLauer
考虑到64位设备的影响,您可能需要重新审查此内容。 - user

0

这完全取决于你的需求。但是,如果 API 要求你使用 int,那么你应该使用 int。如果它要求你使用 NSNumber,那么你就应该使用 NSNumber

例如,如果你正在使用 UISegmentedControl,并且想要选择一个片段,那么,

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here
// or
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];

0

NSNumber是继承自NSValue包装对象的对象。

int不是对象。

如果使用NSNumber,您可以获得更多的功能来利用它们。

http://developer..com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

NSNumber是一个类,可以帮助你将数字类型存储为对象。它具有在不同类型之间转换的方法以及检索数值字符串表示的方法。 如果您像在示例中一样使用类型为NSNumber*的变量day,那么您修改的并非day的值而是它的内存地址。


你的URL中间缺少一个苹果。 - Bronzdragon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接