在非可变数组中实例化多个对象

时间:2013-08-30 11:33:55

标签: objective-c nsarray

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

- (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. 专注于代码简洁。

2 个答案:

答案 0 :(得分:3)

NSMutableArrayNSArray的子类,所以这样就可以了:

return _temporaryArray;

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

这似乎符合您的标准:

  1. 专注于表现:无需复制
  2. 专注于内存消耗:无需复制
  3. 专注于代码简洁:无需复制
  4. 但请注意,从理论上讲,调用者可以将NSArray强制转换回NSMutableArray并开始修改对象,但是您应该担心这一点。

答案 1 :(得分:0)

只是一个小问题:

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

虽然运行时只会将容量作为咨询号码,而不是创建一个完全相同的大小。