NSNumber与NSArray的原始int

时间:2013-12-15 22:51:34

标签: objective-c cocoa

我正在使用第四版Cocoa Programming for Mac OSX学习Objective-C / Cocoa。我为基本问题道歉,但我是那些真正需要了解所有内容的人之一,以便对我有意义,而本书并不总能满足我的需求。我已经掌握了C ++的基础知识,现在我正在学习Obj-C,这就是我的背景。这是我正在学习的一段代码......

for (i= 0; i < 10; i++) {
    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(i * 3)];
    [array addObject:newNumber];
}

我的问题是为什么你要创建NSNumber的实例来添加到数组而不是只是一个整数变量。看起来这只是额外的开销,可以避免每个循环创建一个新实例。但我确信作者知道他们在做什么,并且有理由,有人可以解释一下吗?

3 个答案:

答案 0 :(得分:6)

NSArray只能保存对象,而不能保存原始类型。 NSNumber和NSValue用于在对象中包装原始类型,因此它们可以存储在基础集合中,如NSArray,NSDictionary和NSSet(以及它们的可变/有序对应物)。正如Peter Hosey在评论中指出的那样:

  

这个常用术语是“装箱”(就像装箱一样),反向提取箱子对象的原始值 - 是拆箱。

答案 1 :(得分:2)

由于Core Foundation类无法直接使用基本类型,因此它们只能处理NSObject个实例(它们是OOP术语中的对象,而不是基元)

这就是为什么你被迫用int(或NSNumberNSData)包裹你的NSValue变量的原因。这肯定会带来一些开销,实际上如果你需要性能关键代码,我建议你使用Objective-C ++并依赖STL(例如std::vector<int>)。

我个人不得不放弃所有核心基础课程,而不是因为在管理大量原始数据时无法保持STL而支持STL。

答案 2 :(得分:1)

NSArray直接处理指针 - 扩展名为对象 - 而int是原始类型。 NSNumber存在以弥合这一差距。可以从NSNumberint或甚至float投射bool。重点是它为对象提供了一个指针,并且该指针可以添加到数组中。