What kind of object does @[obj1, obj2] create?
Asked Answered
H

2

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?

Hagar answered 1/8, 2012 at 12:53 Comment(0)
A
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

Actaeon answered 1/8, 2012 at 12:55 Comment(5)
if I need to create a not autorelease object, can't use above literal?Hagar
you can still use it, just retain the array afterwardsActaeon
Thanks wattson12. Is it also possible to intentionally release above autoreleased object?Hagar
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)Actaeon
"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.Ballyrag
R
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

Radiobiology answered 1/8, 2012 at 12:57 Comment(1)
"The compiler changes this to:" No, it changes it to use arrayWithObjects:count:.Ballyrag

© 2022 - 2024 — McMap. All rights reserved.