As both of the following serves the same purpose,
today = [[NSDate date] retain];
and
today = [[NSDate alloc] init];
<
Most of the time, when a class has an autoreleased initializer - it looks like this:
return [[[NSDate alloc] init] autorelease];
So when you call [[NSDate date] retain];, you are effectively calling
[[[[NSDate alloc] init] autorelease] retain];
Which, if you ask me, is fairly pointless - I'd just stick to [[NSDate alloc] init]; for initializing objects.
The convinience method is there so you can quickly get an autoreleased object - not to be used in conjunction with retain. It will do the same, but I would say it's better just to call the standard initialiser if you want a retained object.