当我开始使用OSX / iOS时,我使用了
NSMutableArray * a1 = [NSMutableArray arrayWithCapacity:123] ;
NSMutableDictionary * d1 = [NSMutableDictionary dictionaryWithCapacity:123] ;
然后我发现了'更简单'的版本
NSMutableArray * a2 = [NSMutableArray array] ;
NSMutableDictionary * d2 = [NSMutableDictionary dictionary] ;
我现在搬到了:
NSMutableArray * a3 = [@[] mutableCopy] ;
NSMutableDictionary * d3 = [@{} mutableCopy] ;
在功能上,它们看起来都是相同的:一旦初始化,无论它们是如何创建的,都可以使用它们。 差异在哪里?
特别是,我应该假设d3 / a3在内存预分配方面(或缺少d3 / a3)与d1 / a1更相似(或缺少)?
或者这只是风格问题?
答案 0 :(得分:2)
表单1是类工厂方法,当您知道集合最初需要的大小或者您知道大小将是常量但内容可能会发生变化时,这种方法非常有用。
表单2是一个等同于调用new的类工厂方法。这可能与init后面的alloc相同,也可能不同,但实际上是相同的。
表单3隐含地与alloc分别跟随initWithArray:或initWithDictionary:相同。它很方便,但会生成一个不需要的不可变实例,在ARC下丢弃它,它可能在丢弃时不清楚。
如果您不打算在其他地方再次使用不可变实例,请使用表单一或表单二。
答案 1 :(得分:1)
a1 / d1为123个条目分配了足够的初始空间。
a2 / d2被分配了足够的初始空间,用于5个条目。
如果您知道要添加一堆条目,则a1 / d1更有效,因为字典不必继续分配更多内存来容纳越来越多的条目。
a3 / d2更接近a2 / d2,但它们实际上与:
相同NSMutableArray *a4 = [[NSArray array] mutableCopy];
效率低于a2。
答案 2 :(得分:1)
在第一个示例中,您不仅可以创建可变字典和数组,还可以指定其容量。如果您正在进行一些复杂的计算,在此期间您创建了大量可变集合,这非常有用,因为它可以在这种情况下提高性能。另外两个例子是相同的。文字是在不到一年前推出的,他们只是为了让开发人员的生活更轻松。