8

可能重复:
我应该更喜欢使用文字语法还是构造函数来创建字典和数组?

有什么区别:

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

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

其中之一是更稳定,更快还是其他?

4

3 回答 3

11

文档没有直接提及任何有关效率的内容,但确实提到了

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

相当于

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

我不得不假设在装配级别上,两者是相同的。

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

于 2012-10-11T07:47:19.760 回答
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)

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

于 2012-10-11T07:47:50.650 回答
0

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

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

字符串也会发生同样的情况@"String"

编辑:好的,假设发生了类似的事情:) 实际上没有其他基本字符串的构造函数。

于 2012-10-11T07:49:57.357 回答