1つ目は、2つ目の構文糖衣です。nil
それは短く、リストの終わりをマークするために番兵を必要としないので、それはわずかに良いです。(2番目のバリアントを使用して、を忘れると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)
結論を出すのに十分なアセンブリはわかりませんが、確かに同等に見えます。