Существует ли шаблон для работы с ресурсами, не относящимися к памяти, при очистке объекта ObjC?

Для объектов, которые имеют некоторое состояние, связанное с ресурсом, не связанным с памятью, обычно предоставляется метод для явного «завершения» с этим ресурсом. Существует ли предпочтительная общепринятая практика для случая, когда попытка освобождения объекта предпринимается, когда он все еще находится в состоянии «используя мой ресурс»? Я видел несколько разных подходов:

  1. запишите, что программист допустил ошибку, и сообщите им, как ее отладить (это делает NSLock)
  2. позволить вызывающей стороне выбрать, будет ли ресурс управляться вызывающей стороной или будет освобожден при освобождении (например, NSFileHandle)
  3. вызвать исключение, если объект не находится в ожидаемом конечном состоянии, т.е. утверждать, что программист не собирается использовать мой объект таким образом
  4. всегда убираюсь на выходе.

GC docs подтверждают, что управление другими ресурсами наряду с управлением памятью является плохой идеей, и (пока) предоставляют пример выполнения 4, хотя и с оговорками. Итак, кто-нибудь «выбрал» подход, которому следует всегда следовать?


person Community    schedule 13.10.2008    source источник


Ответы (1)


Поскольку большинство объектов инфраструктуры Cocoa предшествуют сборке мусора, вы не можете сделать предположение, что, например, NSFileHandle делает это наилучшим образом. Я думаю, что эта проблема — одна из многих, где мы хотели бы иметь один шаблон для каждого сценария и избавить нас от необходимости делать выбор. К сожалению, я не думаю, что это возможно; вам придется определять, что лучше в каждом конкретном случае.

Вот причины, чтобы выбрать любой из ваших вариантов:

  1. Если автоматическая очистка достаточно безопасна, но программа действительно должна делать это вручную.
  2. Если вы пишете библиотеку, а ресурс может принадлежать или не принадлежать вашему объекту.
  3. Если автоматическая очистка невозможна или как-то рискованно.
  4. Если автоматическая очистка тривиальна и не стоит никого беспокоить, чтобы сделать это вручную.
person benzado    schedule 13.10.2008
comment
К сожалению, не существует единого шаблона, который можно последовательно применять в разных областях, но я думаю, что вы правы. Спасибо. - person ; 08.12.2008