As far as I know, the first one you have to release when you are done, and the second one you don’t. Why would you use the first initialization over the second?
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"title", @"text", nil];
And
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"title", @"text", nil];
As others have said, in one sense there is no difference between your two examples, just that the first one returns a retained object that will not be dealloc’d until you expicitly release it, and the second one is an autoreleased object that will be automatically released at the beginning of the next run loop unless you explicitly retain it before then.
However the key part to your question is:
The commonly regarded approach (support by Apple documentation) is that using autoreleased objects is absolutely fine in most cases. I would not agree with Peter Lewis here about the iPhone being so “underpowered” that you need to avoid autoreleased objects. The additional overhead on the phone on supplying autoreleased objects in most apps is miniscule. Therefore feel free to use autoreleased objects generally in your code, and just explicitly retain them if you need to hang on to them.
However, where it does make a difference is in tight loops. If you are running a while loop for example which executes 1000 times, and you are creating objects within that loop that you will not need afterwards, then you should explicitly create new non-autoreleased objects and explicitly release them. This is because the autorelease pool will not (by default) empty inside the tight loop. Creating a large bunch of autoreleased objects could well start to hit the limitations of the device’s memory.
So in summary; use 2) most of the time, but use 1) if you’re going to be creating and ditching a lot of objects at one time.
Hope that helps