15

我在任何地方都找不到这个,所以我只是要求确定一下。是的,我知道它的基本原理,但我想我宁愿在我犯错一百万次之前把它弄对:

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

(或者对于我正在尝试做的事情,这两个都可能是错误的。如果是这样,请告诉我。它们都可以编译,所以我只是想知道哪个是“正确的”(或首选)以及为什么。)

代码 1:

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

代码 2:

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

3 回答 3

23

NSMutableArray 不采用原始类型

第二个选项是正确的。

于 2012-05-07T17:40:43.737 回答
8

您不能将诸如 an 之类的原语int放入NSArray; 您必须构造一个NSNumber实例来保存它。

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

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

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

不过有趣的是,从 Clang 3.1 或 Apple 的 LLVM 4.0* 开始,有一些新的语法糖可用于从代码中的文字创建对象。我们一直有文字NSStrings: @"Lichtenstein"。使用新的编译器,其他对象同样可以使用该@字符创建。

NSNumber在这种情况下,要从文字整数创建对象,您可以简单地编写:

[array addObject:@0];

* (在公共 Xcode 中尚不可用)

于 2012-05-07T17:46:06.603 回答
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

于 2012-05-07T18:18:35.923 回答