2013-10-04 41 views
2

通常,当我们要初始化NSMutableArray我们使用:在初始化NSMutableArray时使用短语法是否正确?

NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects: @"one", @"two", @"three", nil]; 

但是,是不是正确使用语法,如:

NSMutableArray *mArr = @[@"one", @"two", @"three"].mutableCopy; 

我明白了,它会成功几个纳秒的时间。但我认为第二种方式更可读,我准备牺牲那些纳秒。

它是确定,使用这样的结构? ARC是否清理未使用的NSArray,我正在使用它来获取可变副本?这难道不是泄漏吗?

+1

注意,这可能是应该,如果你正在做成千上万的在短期内是可以避免的,与其说是因为CPU时间,但这么多的额外的对象创建的东西。 –

回答

4

但我认为第二种方式是方式更具有可读性

就个人而言,我觉得它更混乱,更令人迷惑,因为你正在使用mutableCopy,如果它是一个属性。正确,正确,但完全误导恕我直言。

为什么不采取继承的优势在哪里?

NSMutableArray *ma = [NSMutableArray arrayWithObjects:@"foo", @"bar", nil]; 

有时集合在默认情况下是可变的,将是更多的使用。 *叹*

+1

同意。在我工作的应用程序中,我们倾向于使接口返回可变数组,因为这就是get的创建方式,因为让它们可变是很有用的。 (我不记得一个案例,在4年的iOS编程中,有一个可变阵列导致了一个不可变的阵列会阻止的错误。) –

+0

@HotLicks当然。大多数脚本语言只有可变集合。 **但这不是关于语义错误的。**苹果公司关于默认不可变性收藏的论点是性能。当你复制大量的数组时,如果使用简单的'retain'或整个循环来复制所有成员来实现'copy',那就很重要。不过,我必须承认,我无法找到一个具有代表性的例子。 – 2013-10-04 17:42:10

+1

除此之外,在“现实生活”,只有当一个人想无论是“快照”一个可变数组或一个非可变数组的可变副本的副本时发生复制。制作非可变数组的不可变副本很少这样做。(我提到的错误,因为这是经常为理由,希望非可变数据给出。) –

0

我通常使用arrayWithArray。

NSMutableArray *foo = [NSMutableArray arrayWithArray:@[@"one", @"two", @"three"]]; 
+1

也可以像H2CO3所示的那样使用arrayWithObjects。 –

+1

他说他发现@ []语法更具可读性,所以我给了他一个使用它的选项。而且你不需要那最后的零,我觉得美观不愉快。 :) – jsd

3

是的,它的确定初始化可变数组这样一来,如果你愿意(为你指示)支付性能成本。 ARC会适当地清理一切。它不会泄漏。

+0

Apple在一些代码示例中以这种方式使用它,所以是的 - 它没关系。 – ecth