1

当我开始使用 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 在内存预分配(或缺乏)方面比 d1/a1 更类似于 d2/a2 吗?

或者这只是风格问题?

4

3 回答 3

2

Form one is class factory method that is an optimization useful when you know how large a collection initially needs to be or you know the size will be constant but content may change.

Form two is a class factory method equivalent to calling new. This may or may not be the same as alloc followed by init, but is effectively the same.

Form three is implicitly the same as alloc followed by initWithArray: or initWithDictionary: respectively. It's convenient but generates an unneeded immutable instance that is discarded under ARC it may not be clear when it is discarded.

Use form one or form two generally if you are not going to ever use the immutable instance again elsewhere.

于 2013-05-14T04:48:51.390 回答
1

a1/d1 被分配了足够的初始空间来容纳 123 个条目。

a2/d2 分配有足够的初始空间用于 5 个条目。

如果您知道要添加一堆条目,则 a1/d1 效率更高,因为字典不必不断分配更多内存来保存越来越多的条目。

a3/d2 更接近 a2/d2 但它们实际上与以下内容相同:

NSMutableArray *a4 = [[NSArray array] mutableCopy];

这比a2效率低。

于 2013-05-14T03:10:59.417 回答
1

在第一个示例中,您不仅创建了可变字典和数组,还指定了它们的容量。如果您进行一些复杂的计算并创建大量可变集合,这将非常有用,因为在这种情况下它可以提高性能。其他两个例子是一样的。文字是在不到一年前引入的,它们的存在只是为了让开发人员的生活更轻松。

于 2013-05-14T03:16:46.503 回答