7

I came across the following:

NSArray *array = @[object1, object2];

It seems to be creating an NSArray, but is this array instance an autoreleased object, or must I release it?

jscs
  • 63,694
  • 13
  • 151
  • 195
S.J. Lim
  • 3,095
  • 3
  • 37
  • 55

2 Answers2

9

This is a new collection literal available in the compiler that ship with xcode 4.4 and above

@[object1, object2];

is equivalent to

[NSArray arrayWithObjects:object1, object2, nil];

so yes, it is an autoreleased object, if you need this to be retained, you can do

myRetainedArray = [@[object1, object2] retain];

this question has a good description of all of the new literals

Community
  • 1
  • 1
wattson12
  • 11,176
  • 2
  • 32
  • 34
  • if I need to create a not autorelease object, can't use above literal? – S.J. Lim Aug 01 '12 at 13:14
  • you can still use it, just retain the array afterwards – wattson12 Aug 01 '12 at 13:15
  • Thanks wattson12. Is it also possible to intentionally release above autoreleased object? – S.J. Lim Aug 01 '12 at 13:31
  • this literal is just a convenience to make creating arrays neater. you still have to manage its memory the same as you would with any other object (or switch to ARC) – wattson12 Aug 01 '12 at 13:36
  • 1
    "is equivalent to" It's not equivalent. It uses `arrayWithObjects:count:` internally. `arrayWithObjects:` will stop at the first `nil` argument, which means if you have a `nil` value in the list, it will stop there, and there is no error; whereas with array literals (as well as `arrayWithObjects:count:`), it will throw an exception if one of the things in the list is `nil`. – user102008 Nov 13 '12 at 00:58
0

It's the new llvm compiler's literal for creating an array. The compiler changes this to:

NSArray *array = [NSArray arrayWithObjects: object1,object2,nil];

So it is returning an autoreleased object.

A Google search brought up further info:

http://clang.llvm.org/docs/ObjectiveCLiterals.html

Mario
  • 4,530
  • 1
  • 21
  • 32