Существует ли шаблон для работы с ресурсами, не относящимися к памяти, при очистке объекта ObjC? - PullRequest
4 голосов
/ 13 октября 2008

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

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

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

1 Ответ

1 голос
/ 13 октября 2008

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

Вот причины для выбора любого из ваших вариантов:

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