I was looking at someone else's code and noticed they called 'release' on an NSString they didn't own (never called alloc/retain/copy anywhere and it wasn't a property).
This looked a bit strange to me and it made me wonder if any strange behaviour can occur if you call 'release' on an object that you either don't 'own' or whose ref count is already 0? The code below compiles/runs fine without warnings so I'm guessing there's no problem but I was just curious.
// Releasing an object I don't own
NSString *notMyString = [NSString stringWithString:@"Not mine."];
[notMyString release]; // Ignored?
// Releasing an object I own, twice
NSString *myString = [[NSString alloc] initWithString:@"Mine."];
[myString release]; // Ref count = 0
[myString release]; // Ref count = ?