2013-05-09 16 views
5

Jeśli piszę -NSObject wydany, NSString, NSArray nie?

NSObject *a = [[NSObject alloc] init]; // or UIView or something 
[a release]; 
NSLog(@"a = %@", a); // causes EXC_BAD_ACCESS, fine 

Ale jeśli piszę -

NSArray *a = [[NSArray alloc] init]; // or NSString or NSDictionary 
[a release]; 
NSLog(@"a = %@", a); // no crash, prints empty array or string 

Dlaczego drugi przypadek nie powoduje złe dostęp, ponieważ jest zwolniony?

Odpowiedz

8

Uzyskiwanie dostępu do zwolnionego obiektu nie musi natychmiast powodować awarię aplikacji.

Pamiętaj, że nawet jeśli zwolnisz obiekt, pamięć pozostanie tam przez pewien czas, z tą samą zawartością. Dostaniesz awarię tylko wtedy, gdy pamięć obiektu została już nadpisana przez jakiś inny obiekt. I pamiętaj, że nawet przy nadpisanej pamięci nie musisz się zderzać. Możesz uzyskać tylko bardzo dziwne zachowanie (np. Gdy obiekt jest NSString, może uzyskać inną zawartość).

Zasadniczo to zachowanie jest całkowicie losowe. Użycie zwolnionego obiektu może spowodować awarię aplikacji natychmiast, w ciągu 5 minut lub w ciągu 2 godzin.

Edit: Dzięki Martin R ciekawej komentarza. Wygląda na to, że tablica utworzona przez [[NSArray alloc] init], czyli pusta niezmienna tablica, zwraca zawsze to samo wystąpienie. Oznacza to, że Twój release nie spowoduje zwolnienia. Jednak to zachowanie może się łatwo zmienić, może różnić się w zależności od kompilatorów lub wersji systemu operacyjnego.

+0

Jesteś szybszy ode mnie, miałem zamiar odpowiedzieć dokładnie w ten sam sposób, ale nawet nie napisałem jednego słowa. +1 – borrrden

+0

Ale zwolnienie NSObject lub UIView itp. Są zdecydowanie awaryjne natychmiast, podczas gdy NSArray lub NSString itp. Zdecydowanie nie ulegają natychmiastowemu zawieszeniu. Więc pewna różnica musi istnieć w użyciu pamięci, przypadku zwolnienia tablicy lub łańcucha. Co to jest? – user1559227

+0

Zobacz ** losowo **. W takim przypadku spowoduje awarię dla NSObject, ale nie dla NSArray. Jeśli kompilujesz z różnymi opcjami, może nie zachowywać się w ten sposób. Sposób korzystania z pamięci przez system operacyjny zależy od wielu czynników. Taka jest różnica między * wydaną * i * zdezalokowaną * – borrrden