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.
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
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
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