将整数添加到NSMutableArray

时间:2012-05-07 17:39:16

标签: objective-c arrays object nsnumber

我无法在任何地方找到这个,所以我要求确认一下。是的,我知道它的基本功能,但我认为在我犯错百万次之前我宁愿做到这一点:

如果我执行以下操作,默认情况下会将“0”转换为NSNumber(如果不是,它是什么对象类型),还是我必须执行第二个代码?

(或者这些都可能是错误的我想要做的。如果是这样,请告诉我。他们都编译所以我只是想知道哪一个是“正确”(或首选)以及为什么。)< / p>

代码1:

NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];

代码2:

NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];

3 个答案:

答案 0 :(得分:21)

NSMutableArray 不采用原始类型

  

第二种选择是正确的。

答案 1 :(得分:6)

您不能将int等原语放入NSArray;你必须构造一个NSNumber实例来保存它。

  

如果我执行以下操作,默认情况下会将“0”强制转换为NSNumber(如果不是,那么它是什么对象类型)

不进行任何铸造。将基元简单地“转换”为对象是不可能的,并且基元没有对象类型。必须通过发送消息来构造对象(除了:见下文),这些消息在运行时发生;仅在编译期间进行转换。

这样做的唯一原因是您已选择0添加到数组中。这与nil的值相同,代表“无对象”。如果您选择了任何其他整数,则在运行代码时会出现崩溃,因为该值将用作指向不包含有效对象的内存的指针。

有趣的是,从Clang 3.1或Apple的LLVM 4.0开始,* some new syntatical sugar用于在代码中从文字创建对象。我们一直有文字NSStrings@"Lichtenstein"。使用新编译器,同样可以使用@字符创建其他对象。

在这种情况下,要从文字整数创建NSNumber对象,您只需编写:

[array addObject:@0];

* (尚未在公共Xcode中提供)

答案 2 :(得分:0)

如前面的回复所述,您只能将对象(id类型)添加到NSArray等容器类中。

在此上下文中可以提供帮助的一个类是NSValue,它用作C和objective-C的非对象数据类型的容器。除了数值数据类型,它还可以包含结构和一些Objective-C原始数据类型,如NSRect

在此查看更多详情: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html