Ich habe den Code von jemand anderem angeschaut und bemerkt, dass sie 'release' auf einem NSString aufgerufen haben, den sie nicht besaßen (nie alloc/retain/copy anywhere genannt und es war keine Eigenschaft)."Freigabe" zu oft aufrufen?
Das sah ein bisschen komisch aus und es ließ mich fragen, ob irgendein merkwürdiges Verhalten auftreten kann, wenn Sie "release" auf einem Objekt aufrufen, das Sie entweder nicht besitzen oder dessen ref count bereits 0 ist? Der Code unten kompiliert/läuft gut ohne Warnungen, also ich vermute, es gibt kein Problem, aber ich war nur neugierig.
// 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 = ?
Der Grund, warum der Code "funktioniert" ist, weil NSString -initWithString: erkennt, dass die übergebene Zeichenfolge eine konstante Zeichenfolge ist und daher keine neue Zuordnung erforderlich ist. Da konstante Strings Retain/Release ignorieren, funktioniert der Code zufällig. – bbum