NSArray Literals In Objective-C
July 30, 2012
When running Xcode 4.4 (the latest download from the Mac App Store) I noticed the option for Apple LLVM Compiler 4.0:

One reason this is significant is that you can now define literals for a number of additional objects, similar to how you define string literals with the @ prefix. In this post I’ll show you how to use NSArrays literals. Let’s look at a few examples:
// Previous format to define empty array NSArray *emptyArray = [NSArray array]; // Previous format to define single element array NSArray *singleElementArray = [NSArray arrayWithObject:@"Error Message"]; // Previous format to define array of strings NSArray *arrayOfStrings = [NSArray arrayWithObjects: @"First Name", @"Last Name", nil]; |
The new NSArray literal format follows:
// Literal format for empty array NSArray *emptyArray = @[]; // Literal format for single element array NSArray *singleElementArray = @[@"Error Message"]; // Literal format for array of strings NSArray *arrayOfStrings = @[@"First Name", @"Last Name"]; // Literal format for array of objects NSArray *arrayOfObjects = @[singleElementArray, arrayOfStrings, singleElementArray]; |
Notice there is no nil value required for the array of objects! Let’s take a look at why that is. If you write something like this:
NSArray *arrayOfStrings = @[@"First Name", @"Last Name"]; |
The compiler will now generate the following code:
id objects[] = { @"First Name", @"Last Name" }; NSUInteger count = sizeof(objects) / sizeof(id); NSArray *arrayOfStrings = [NSArray arrayWithObjects:objects count:count]; |
And with is approach, if you enter nil for any argument, the compiler will generate an error. For example:
NSArray *arrayOfStrings = @[@"First Name", nil, @"Last Name"]; |
Will result in an error Collection element of type “void” is not an Objective-C object.
NSArray literals are a very welcome addition to Objective-C. Stay tuned – in upcoming posts, I’ll also show you how to work with NSDictionary and NSNumber literals.



