@ []和[NSArray arrayWithObjects:]之间的区别

时间:2012-10-11 07:37:34

标签: objective-c nsarray objective-c-literals

  

可能重复:
  Should I prefer to use literal syntax or constructors for creating dictionaries and arrays?

之间有什么区别:

NSArray *array = @[@"foo", @"bar"];

NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", nil];

其中一个更稳定,更快还是其他什么?

3 个答案:

答案 0 :(得分:10)

documentation没有直接提及效率,但确实提到了

NSArray *array = @[@"foo", @"bar"];

相当于

NSString *strings[3];
strings[0] = @"foo";
strings[1] = @"bar";
NSArray *array = [NSArray arrayWithObjects:strings count:2];

我必须假设在汇编级别,两者是相同的。

因此,唯一的区别是偏好。我更喜欢前者,输入更快,更直接理解。

答案 1 :(得分:6)

第一个只是第二个语法糖。它稍微好一些,因为它更短,并且不需要标记nil来标记列表的结尾。 (当您使用第二个变体并忘记nil时,您可以获得一些非常难以预测的行为。)

如果他们两个都没有生产相同的组件,性能差异会很小,对任何人来说都不是问题。这就是程序集用文字简写查找第一个案例的方法:

// NSArray *bar = @[@"bar"];
movl    %edi, -40(%ebp)
movl    L_OBJC_CLASSLIST_REFERENCES_$_-L0$pb(%esi), %eax
movl    L_OBJC_SELECTOR_REFERENCES_4-L0$pb(%esi), %edi
movl    %eax, (%esp)
movl    %edi, 4(%esp)
movl    %edx, 8(%esp)
movl    $1, 12(%esp)
movl    %ecx, -76(%ebp)         ## 4-byte Spill
calll   L_objc_msgSend$stub
movl    %eax, (%esp)
calll   L_objc_retainAutoreleasedReturnValue$stub
movl    %eax, -36(%ebp)

arrayWithObjects

就属于这种情况
// NSArray *foo = [NSArray arrayWithObjects:@"foo", nil];
movl    L_OBJC_CLASSLIST_REFERENCES_$_-L0$pb(%ecx), %eax
movl    L_OBJC_SELECTOR_REFERENCES_-L0$pb(%ecx), %edi
movl    %eax, (%esp)
movl    %edi, 4(%esp)
movl    %edx, 8(%esp)
movl    $0, 12(%esp)
movl    %esi, -72(%ebp)         ## 4-byte Spill
calll   L_objc_msgSend$stub
movl    %eax, (%esp)
calll   L_objc_retainAutoreleasedReturnValue$stub
movl    $1, %ecx
leal    -40(%ebp), %edx
movl    -64(%ebp), %esi         ## 4-byte Reload
leal    L__unnamed_cfstring_2-L0$pb(%esi), %edi
movl    %eax, -32(%ebp)

我不知道足够的集会来得出结论,但它们看起来确实具有可比性。

答案 2 :(得分:0)

这是Objective C 3.0中发明的新功能

编译器基本上用[NSArray arrayWithObjects:...]语句替换快捷方式。

字符串@"String"

也是如此

编辑:好的,让我们说类似的事情:) 实际上没有基本字符串的其他构造函数。