To jest zwykle dla obiektów, które mają jakiś stanzwiązane z zasobem niepamięci, aby zapewnić metodę jawnego "ukończenia" tego zasobu. Czy istnieje preferowana powszechna praktyka radzenia sobie z przypadkiem, w którym podjęto próbę dealokacji obiektu, gdy wciąż znajduje się w stanie "używając mojego zasobu"? Widziałem kilka różnych podejść:
- zaloguj się, że programista popełnił błąd i powiedz mu, jak to debugować (
NSLock
robi to) - pozwól dzwoniącemu wybrać, czy zasób jest zarządzany przez dzwoniącego, czy zrezygnować z niego podczas dealokacji (np.
NSFileHandle
) - podnieść wyjątek, jeśli obiekt nie znajduje się w oczekiwanym stanie końcowym, to znaczy twierdzić, że programista nie będzie używał mojego obiektu w ten sposób
- zawsze sprzątaj po drodze.
The Dokumenty GC potwierdź, że zarządzanie innymi zasobami wraz z zarządzaniem pamięcią to Zły pomysł i (jeszcze) dostarczaj przykładu wykonania 4, aczkolwiek z zastrzeżeniami. Czy ktokolwiek "wybrał" podejście, aby zawsze podążać?
Odpowiedzi:
1 dla odpowiedzi № 1Ponieważ większość obiektów szkieletowych Cocoa poprzedziłagarbage collection, nie można przyjąć założenia, że NSFileHandle na przykład robi to najlepiej, myślę, że ten problem jest jednym z wielu, w którym chcielibyśmy mieć jeden wzorzec do naśladowania dla każdego scenariusza i zaoszczędzić nam kłopotu dokonywania wyboru. Niestety, nie sądzę, że to możliwe; będziesz musiał ustalić, co jest najlepsze w poszczególnych przypadkach.
Oto powody, aby wybrać dowolną z opcji:
- Jeśli automatyczne czyszczenie jest dość bezpieczne, ale program naprawdę powinien zrobić to ręcznie.
- Jeśli piszesz bibliotekę i zasób może lub nie może być własnością twojego obiektu.
- Jeśli automatyczne czyszczenie nie jest możliwe lub jakoś ryzykowne.
- Jeśli automatyczne czyszczenie jest trywialne i nie warto przejmować się tym, aby zrobić to ręcznie.