Actually, every time you initialize an object, and the method name includes "init", you are responsible for freeing it. If you create an object using a class method that does not include the word "init", then you do not.
For example:
NSString *person = [NSString stringWithFormat:"My name is %@", name];
no release required. But:
Person *person = [[Person alloc] init];
release required (as you said in your question). Similar:
Person *person = [[Person alloc] initWithName:@"Matt"]];
release is also required.
This is an agreement, not a language rule, but you will find that it is true for all APIs supplied by Apple.