Обычно для объектов, имеющих некоторое состояние, связанное с ресурсом, не связанным с памятью, предоставляется метод для явного «завершения» этого ресурса. Есть ли предпочтительная распространенная практика для случая, когда попытка освобождения объекта выполняется, пока он находится в состоянии «использование моего ресурса»? Я видел несколько разных подходов:
- записать, что программист совершил ошибку, и сказать им, как ее отладить (
NSLock
делает это)
- позволяет вызывающей стороне выбрать, будет ли ресурс управляться вызывающей стороной или отказаться от нее при освобождении (например,
NSFileHandle
)
- вызывает исключение, если объект не находится в ожидаемом конечном состоянии, то есть утверждает, что программист не собирается использовать мой объект таким образом
- всегда убирайся на выходе.
Документы GC подтверждают, что управление другими ресурсами наряду с управлением памятью является плохой идеей, и (пока) предоставляют пример выполнения 4, хотя и с оговорками. Так кто-нибудь «выбрал» подход, которому всегда следует следовать?