There aren't too many cases where you HAVE to autorelease. In fact, due to the limited resources available on the iPhone, you want to avoid autoreleasing as much as possible.
Generally speaking, your variables should have a 3-step life.
- Creation. Ex: NSString *myString = [[NSString alloc] init];
- Use. Ex: [[cell textLabel] setText: myString];
- Release: Ex: [myString release], myString = nil;
As long as you do the release before you hit the last } in your method (or loop, depends on where you created it), you should be fine.
Other than that, I'd say that the rest of what you said is generally correct. You would need to post some specific examples of where you are crashing in order to get better help.
Edit:
Option 1 is correct (well, that may not be the best initialization example, since the string really doesn't have a value, but you get the idea). Option 2 is a leak.
IMO, do yourself a favor and avoid dot-syntax. Ex:
[self setStringIWant: string];