1

我经常发现自己实现了在循环中创建一堆对象并将它们返回到非可变数组中的方法。我通常会这样写:

- (NSArray *)myObjects {
    NSMutableArray *_temporaryArray = [NSMutableArray array];
    for (id foo in foos) {
        // ... 
        // create `myObject` from the information in `foo`
        // ... 
        [_temporaryArray addObject:myObject];
    }
    return [NSArray arrayWithArray:_temporaryArray];
}

不知何故,这种模式感觉不是很优雅(创建一个临时的可变实例似乎是一种开销)。所以现在我正在根据用例寻找更好的实现。

对于这些情况,最好的实现是什么:

  1. 专注于表现
  2. 关注内存消耗
  3. 专注于代码简洁。
4

2 回答 2

3

NSMutableArray是 的子类NSArray,因此可以正常工作:

return _temporaryArray;

(但是,我会避免使用_前缀,因为它通常用于表示实例变量,而不是auto变量)。

这似乎符合您的标准:

  1. 注重性能:无需复制
  2. 关注内存消耗:无需复制
  3. 注重代码简洁:无需复制

但是请注意,从理论上讲,调用者可以将您的NSArray背投到 anNSMutableArray并开始修改对象,但是您应该担心的只有这么多。

于 2013-08-30T11:44:25.547 回答
0

只是一个小问题:

NSMutableArray *temporaryArray = [NSMutableArray alloc] initWithCapacity:[foos count]];

尽管运行时只会将容量作为一个建议数字,而不是创建一个完全相同的大小。

于 2013-08-30T11:50:44.657 回答