Episode Links

The new syntax is supported in Xcode 4.4, and has no runtime requirements, meaning you can use this today if you’re on the latest tools!

New Collection Literals

Creating an NSDictionary is much easier:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
       [NSNumber numberWithBool:YES], @"backup",
       [NSNumber numberWithInt:7],    @"daysToKeepBackup,
       @"foo",                        @"flags", nil];

// becomes:
NSDictionary *options = @{ 
  @"backup": @YES,
  @"daysToKeepBackup": @7,
  @"flags", @"foo"

Arrays also got some love:

NSArray *items = [NSArray arrayWithObjects:@"item1", [NSNumber numberWithBool:YES], [NSNumber numberWith:12], nil];

// becomes:

NSArray *items = @[ @"item1", @YES, @12 ];


Subscripting is now supported if you’re building for iOS 6 / 10.8. It looks like this:

id item = myArray[0];

id item2 = myDictionary[@"myKey"];

These are equivalent to objectAtIndex: and objectForKey: respectively.

Boxing Expressions

Sometimes you want to use an object literal for a BOOL or int, but the result needs to be calculated. To do this, you have to use parentheses:

NSNumber *total = @(28.90f - 1.89f);
NSNumber *disabled = @(!enabled);

C Strings

You can also easily convert a unicode C string into an NSString:

char * str = "I am a nil terminated C string";
NSString *myString = @(str);

Note that this only works if the string is in utf-8 encoding and is nil terminated.