可能重复:
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];
其中一个更稳定,更快还是其他什么?
答案 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"
编辑:好的,让我们说类似的事情:) 实际上没有基本字符串的其他构造函数。