Using @[array, of, items] vs [NSArray arrayWithObjects:]
Asked Answered
N

2

12

Is there a difference between

NSArray *myArray = @[objectOne, objectTwo, objectThree];

and

NSArray *myArray = [NSArray arrayWithObjects:objectOne, objectTwo, objectThree, nil];

Is one preferred over the other?

Nervine answered 25/1, 2013 at 17:49 Comment(3)
possible duplicate of Difference between @[] and [NSArray arrayWithObjects:]Possessory
Sorry, I even searched google and here. Maybe the symbols were messing up the search that is why i wasn't getting anything relevant.Nervine
It's not meant to be a recrimination. Actually, that comment is created by the system on my behalf when I vote to close.Possessory
F
32

They are almost identical, but not completely. The Clang documentation on Objective-C Literals states:

Array literal expressions expand to calls to +[NSArray arrayWithObjects:count:], which validates that all objects are non-nil. The variadic form, +[NSArray arrayWithObjects:] uses nil as an argument list terminator, which can lead to malformed array objects.

So

NSArray *myArray = @[objectOne, objectTwo, objectThree];

would throw a runtime exception if objectTwo == nil, but

NSArray *myArray = [NSArray arrayWithObjects:objectOne, objectTwo, objectThree, nil];

would create an array with one element in that case.

Fourhanded answered 25/1, 2013 at 17:55 Comment(2)
+1 This is the correct answer; the difference is subtle, but nevertheless the two are different.Tolle
I'm not sure what "malformed array objects" means, but the arrays would be perfectly fine, just not the length you thought they would be. Also, I sometimes intentionally exploit the nil termination behavior, to have an optional last element that is only included if it is not nil.Eliseo
C
-2

No. At compile time the @[...] literals will be changed to arrayWithObjects:

The only difference is that @[...] is only supported in newer versions of the LLVM compiler.

Chastise answered 25/1, 2013 at 17:51 Comment(1)
No it is arrayWithObjects:count:Eliseo

© 2022 - 2024 — McMap. All rights reserved.