向NSMutableArray添加整数

15

我在任何地方都找不到这个答案,所以我只是确认一下。是的,我知道这很基础,但我想我宁愿在犯错一百万次之前先把它搞对:

如果我执行以下操作,它会默认将"0"转换为NSNumber类型(如果不是NSNumber类型,那么是什么对象类型),或者我需要执行第二个代码?

(或者这两个代码都可能不适用于我想要做的事情。如果是这样,请让我知道。它们都可以编译,所以我想知道哪一个是“正确”的(或首选)以及为什么。)

代码1:

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

代码2:

NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
3个回答

25

NSMutableArray 无法使用原始类型。

第二个选项是正确的。


好的,太棒了。谢谢!我很快就会将其标记为正确答案(它说我必须等待10分钟才能接受这个问题的答案)。 - MrHappyAsthma
1
我很高兴能够帮助。 - Daniel Bidulock
如果我有一个变量需要添加 - iOS Developer

8
您不能将原始类型,如int放入NSArray中;您必须构造一个NSNumber实例来保存它。

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

不会进行任何转换。无法简单地将基本类型强制转换为对象,并且基本类型没有对象类型。对象必须通过发送消息来构造(除外:参见下文),这发生在运行时;强制转换只在编译期间产生影响。

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

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

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

[array addObject:@0];

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


Xcode仍未在公共领域中提供吗? - zeytin

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


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