/ / Czy istnieje wzorzec do radzenia sobie z zasobami innymi niż pamięć podczas czyszczenia obiektu ObjC? - cel-c, kakao

Czy istnieje wzorzec do radzenia sobie z zasobami innymi niż pamięć podczas czyszczenia obiektu ObjC? - cel-c, kakao

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ść:

  1. zaloguj się, że programista popełnił błąd i powiedz mu, jak to debugować (NSLock robi to)
  2. pozwól dzwoniącemu wybrać, czy zasób jest zarządzany przez dzwoniącego, czy zrezygnować z niego podczas dealokacji (np. NSFileHandle)
  3. 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
  4. 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 № 1

Ponieważ 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:

  1. Jeśli automatyczne czyszczenie jest dość bezpieczne, ale program naprawdę powinien zrobić to ręcznie.
  2. Jeśli piszesz bibliotekę i zasób może lub nie może być własnością twojego obiektu.
  3. Jeśli automatyczne czyszczenie nie jest możliwe lub jakoś ryzykowne.
  4. Jeśli automatyczne czyszczenie jest trywialne i nie warto przejmować się tym, aby zrobić to ręcznie.