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