Szukałem kodu kogoś innego i zauważyłem, że nazwało to "release" na NSString, którego nie posiadali (nigdy nie nazywane alokowaniem/zatrzymywaniem/kopiowaniem w dowolnym miejscu i nie było to właściwością).Zbyt często dzwonisz do "wydania"?
To wydawało mi się trochę dziwne i zastanawiałem się, czy jakieś dziwne zachowanie może się zdarzyć, gdy wywołasz "zwolnienie" na obiekcie, którego nie posiadasz albo którego wartość ref jest już równa 0? Poniższy kod kompiluje/działa dobrze bez ostrzeżeń, więc zgaduję, że nie ma problemu, ale byłem po prostu ciekawy.
// 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 = ?
Powód, dla którego kod "działa", polega na tym, że NSString -initWithString: rozpoznaje, że łańcuch przekazany jest stałym ciągiem, a zatem nie ma potrzeby nowego przydziału. Ponieważ ciągłe łańcuchy skutecznie ignorują retain/release, kod działa przypadkowo. – bbum