I have two functions which one should i use?
Please explain the difference.
A:
- (NSMutableArray *)FunctionA:(int)count {
NSMutableArray *a = [[NSMutableArray alloc] init];
for (int i = 0; i < count; i++) {
[a addObject:[NSNumber numberWithInt:0] ];
}
return [a autorelease];
}
B:
-(NSMutableArray *)FunctionB:(int)count {
NSMutableArray *b = [NSMutableArray arrayWithCapacity:count];
for (int i=0;i<count; i++){
[b addObject:[NSNumber numberWithInt:0] ];
}
return b; // or [b autorelease] ?
}
The first creates a mutable array without specifying a capacity. This causes the array to have to grow when you add items. Internally, this is probably heavily optimized to occur “chunks at a time” but it’s still necessary to grow the array and allocate more space when adding items.
The second gives the array a hint (you’re probably going to need “this much” room) to avoid the overhead of growing the array when adding a known number of objects. Of course it will still grow larger if needed (as if you hadn’t specified a capacity). You should use this approach if you already know the count ahead of time. It’s faster with a large count.
This has a downside if you haven’t measured before optimizing, however: If you’re creating a mutable array with a very high capacity but not always using that capacity, you incur the penalty of allocating all that space for nothing.
Also, you don’t autorelease B (as you commented out) because you didn’t create the mutable array with init – you used a convenience method which did it itself, which means you’re not responsible for releasing it. As I mentioned in a comment to another answer to your question, you can also create the array with:
[[NSMutableArray alloc] initWithCapacity:capacity];… then release it when ready. This gives you greater control over memory usage than using the autorelease pool, which is an important consideration on the iPhone platform.
Remember, though: measure first, then optimize if necessary.