The best approach is to use ARC and not have to worry about it.
But if you are not using ARC I usually liked case 2 better most of the time. The question is when is the current autorelease pool going to be drained. If there is a loop with a lot of work or I am in a library not knowing the context it will run in I can control when the object is released instead of autoreleasing and it happening at some unknown time in the future. I could make my own autorelease pool for the loop but I preferred the explicit release.
A place I see case 1 used is when assigning an object to a property so it would be a one line statement using autorelease instead of allocate, assign to property, release.
Is there a reason you would not use ARC?