我正在使用第四版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的实例来添加到数组而不是只是一个整数变量。看起来这只是额外的开销,可以避免每个循环创建一个新实例。但我确信作者知道他们在做什么,并且有理由,有人可以解释一下吗?
答案 0 :(得分:6)
NSArray只能保存对象,而不能保存原始类型。 NSNumber和NSValue用于在对象中包装原始类型,因此它们可以存储在基础集合中,如NSArray,NSDictionary和NSSet(以及它们的可变/有序对应物)。正如Peter Hosey在评论中指出的那样:
这个常用术语是“装箱”(就像装箱一样),反向提取箱子对象的原始值 - 是拆箱。
答案 1 :(得分:2)
由于Core Foundation类无法直接使用基本类型,因此它们只能处理NSObject
个实例(它们是OOP术语中的对象,而不是基元)
这就是为什么你被迫用int
(或NSNumber
或NSData
)包裹你的NSValue
变量的原因。这肯定会带来一些开销,实际上如果你需要性能关键代码,我建议你使用Objective-C ++并依赖STL(例如std::vector<int>
)。
我个人不得不放弃所有核心基础课程,而不是因为在管理大量原始数据时无法保持STL而支持STL。
答案 2 :(得分:1)
NSArray
直接处理指针 - 扩展名为对象 - 而int
是原始类型。 NSNumber
存在以弥合这一差距。可以从NSNumber
,int
或甚至float
投射bool
。重点是它为对象提供了一个指针,并且该指针可以添加到数组中。