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?

3
  • possible duplicate of Difference between @[] and [NSArray arrayWithObjects:] Commented Jan 25, 2013 at 18:47
  • Sorry, I even searched google and here. Maybe the symbols were messing up the search that is why i wasn't getting anything relevant. Commented Jan 25, 2013 at 18:57
  • It's not meant to be a recrimination. Actually, that comment is created by the system on my behalf when I vote to close. Commented Jan 25, 2013 at 19:26

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

2 Comments

+1 This is the correct answer; the difference is subtle, but nevertheless the two are different.
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.
-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.

1 Comment

No it is arrayWithObjects:count:

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.