2010-06-18 1 views
5

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

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

Odpowiedz

15

Tak, nie rób tego. Twoja ocena jest poprawna, podobnie jak twoje zrozumienie zasad własności. Wysłanie wiadomości do już wydanego obiektu ma niezdefiniowane zachowanie - czasami będziesz mieć szczęście, ponieważ inne rzeczy będą się dziać i nic się nie stanie. Czasami natychmiast się zawiesisz, czasem później, ponieważ coś zepsujesz.

+2

Tak, to jest długotrwałe zachowanie, o które się martwiłem. Domyślam się, że nie zawsze można ufać przypadkowemu kodowi samouczka na blogu as-is =). Dzięki za szybką odpowiedź. – nebs