2010-06-18 13 views
5

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 = ? 
+2

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

Antwort

15

Ja, mach das nicht. Ihre Einschätzung ist richtig, ebenso wie Ihr Verständnis der Eigentumsregeln. Das Senden einer Nachricht an ein bereits freigegebenes Objekt hat ein undefiniertes Verhalten - manchmal wirst du Glück haben, weil andere Dinge passieren und nichts passieren wird. Manchmal stürzt du sofort ab, manchmal später, weil du etwas anderes beschädigt hast.

+2

Ja, es ist das langfristige Verhalten, um das ich mir Sorgen machte. Ich schätze, Sie können nicht immer zufälligen blog 'tutorial' Code as-is =) vertrauen. Danke für die schnelle Antwort. – nebs