8

Possible Duplicate:
Should I prefer to use literal syntax or constructors for creating dictionaries and arrays?

Is there any difference between:

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

and

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

Is one of those more stable, faster, or anything else?

4

3 に答える 3

11

このドキュメントでは、効率について直接言及していませんが、

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

と同等です

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

アセンブリレベルでは、この2つは同一であると想定する必要があります。

したがって、唯一の違いは好みです。私は前者の方が好きです。入力する方が速く、理解するのがより直接的です。

于 2012-10-11T07:47:19.760 に答える
6

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)

結論を出すのに十分なアセンブリはわかりませんが、確かに同等に見えます。

于 2012-10-11T07:47:50.650 に答える
0

これは、ObjectiveC3.0で新たに発明された機能です。

[NSArray arrayWithObjects:...]コンパイラは基本的にショートカットをステートメントに置き換えます。

文字列でも同じことが起こります@"String"

編集:わかりました、似たようなことが起こったとしましょう:)実際には基本的な文字列の他のコンストラクタはありません。

于 2012-10-11T07:49:57.357 に答える