views:

103

answers:

4

Hi,

I am a bit confused in the following two ways of initialisations.....

Way 1:

- (void) myMethod{

    NSArray *myArray = [[NSArray alloc] initWithObjects:obj1,obj1,nil];
    [self setClassArray:myArray];
    [myArray release];
}

Way 2:

- (void) myMethod{

NSArray *myArray = [NSArray arrayWithObjects:obj1,obj2,nil];
[self setClassArray:myArray];
}

In way 1, I have used a alloc init method which is a instance method and as I have used an alloc statement I have to release the array myself.

In way 2, I have used a static method to initialze the array and as there is no alloc statement used I dont need to release the memory the system will take care of that.

Way 1, is time consuming and can to lead to memory leaks if not taken care

Way 2, is faster in writing and you dont need to take care of memory leaks

But , still i have seen the way1 used in standard source codes more often than the way2. I have no idea why people do this or if I am wrong at some place.

Answers and comments are oppenly invited. Please suggest the best programming practice.

+4  A: 

Your second example uses a convenience constructor, which returns an autoreleased object. The question, then, is whether it's better to use autorelease or alloc/release. mmalc's answer on this StackOverflow thread explains the drawbacks of autoreleasing objects. (Basically, use alloc/release whenever possible.)

Also (this may be stating the obvious), some classes might not have convenience constructors, so when working with these you'd have to use alloc/release.

Steve Harrison
+1  A: 

as i know,

[NSArray arrayWithObjects:obj1,obj2,nil];

returns an autoreleased object, smth like

[[[NSArray alloc] initWithObjects:obj1,obj1,nil] autorelease];

and I prefer not to manage memory with autorelease pool. maybe it's just a prejudice))

Morion
A: 

I usually prefer the second way, and if I recall correctly, this is also what the Apple docs reccommend (use autorelease where possible).

In Way 1 the memory gets released faster, so if you have a method that gets called in a loop or recursively, using autorelease may accumulate much memory, whereas alloc/retain will keep your memory footprint low.

On the other hand I assume that using autorelease is more efficient, because the autorelease pool can release a big chunk of memory at once, instead of small chunks again and again. Tough I may be wrong here.

frenetisch applaudierend
+1  A: 

When using method 2 (autorelease) the object is released when the operating system feels it has no references. But when using the manual release, as you typed in your code, you can release directly, or whenever you need to.

medopal