我无法在任何地方找到这个,所以我要求确认一下。是的,我知道它的基本功能,但我认为在我犯错百万次之前我宁愿做到这一点:
如果我执行以下操作,默认情况下会将“0”转换为NSNumber(如果不是,它是什么对象类型),还是我必须执行第二个代码?
(或者这些都可能是错误的我想要做的。如果是这样,请告诉我。他们都编译所以我只是想知道哪一个是“正确”(或首选)以及为什么。)< / p>
代码1:
NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];
代码2:
NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
答案 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
。