Be careful with NSURLConnection initWithRequest, it does in fact retain the delegate, though I don't know why that would be useful. Don't belive me, just add this assert around the create steps as see for yourself.
int retainCountIn = self.retainCount;
// Create NSURLConnection, passing self as the delegate
int retainCountOut = self.retainCount;
NSAssert(retainCountIn == retainCountOut, @"retainCount incremented on delegate");
The only really safe thing to do is create another little object that will act as the delegate, your class can then hold a ref to it and the connection can hold a ref to it via the delegate. Then, when you are done with the connection (after say a cancel), you can release your ref and the connection can release its ref whenever, and all is well. This is the safe way to avoid a circular ref issue that would otherwise be very hard to figure out and debug.
cheers
Mo DeJong