有什么区别:
NSArray *array = @[@"foo", @"bar"];
和
NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", nil];
其中之一是更稳定,更快还是其他?
有什么区别:
NSArray *array = @[@"foo", @"bar"];
和
NSArray *array = [NSArray arrayWithObjects:@"foo", @"bar", nil];
其中之一是更稳定,更快还是其他?
该文档没有直接提及任何有关效率的内容,但确实提到了
NSArray *array = @[@"foo", @"bar"];
相当于
NSString *strings[3];
strings[0] = @"foo";
strings[1] = @"bar";
NSArray *array = [NSArray arrayWithObjects:strings count:2];
我不得不假设在装配级别上,两者是相同的。
因此,唯一的区别是偏好。我更喜欢前者,打字更快,理解更直接。
第一个只是第二个的语法糖。它稍微好一点,因为它更短并且不需要哨兵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)
我不知道足够的组装来得出结论,但它们看起来确实具有可比性。
这是 Objective C 3.0 中新发明的功能
编译器基本上用[NSArray arrayWithObjects:...]
语句替换了快捷方式。
字符串也会发生同样的情况@"String"
编辑:好的,假设发生了类似的事情:) 实际上没有其他基本字符串的构造函数。