Подтвердить что ты не робот

Должно ли использование NSLocking всегда быть завернуто в @try/@наконец?

Для объекта Cocoa NSLocking (например, NSLock) и некоторого нетривиального кода, который должен выполняться во время блокировки:

Чтобы гарантировать, что блокировка всегда отпущена, следует ли всегда использовать следующую идиому?

NSLock *mutex = // get lock from somewhere
@try {
    [mutex lock];
    // do non-trivial stuff
} 
@finally {
    [mutex unlock];
}

Это кажется разумным (и распространенным в Java), но я не видел никакого кода Cocoa.

Следует ли использовать эту идиому? Почему или почему нет?

4b9b3361

Ответ 1

Чтобы гарантировать, что блокировка всегда отпущена, следует ли всегда использовать следующую идиому?

Да, где требуется правильность программы после этой области ( "нетривиальный материал" ), и предполагая, что ваша программа может правильно восстановиться из тех исключений, с которыми она сталкивается.

Следует ли использовать эту идиому? Почему или почему нет?

Если вы можете восстановить, тогда да, разблокировка необходима для продолжения выполнения. В противном случае ваша программа будет выполняться в недопустимом состоянии.

  • Пример 1: Когда блокировка уничтожена (во время dealloc), попытка ее уничтожить не удастся, поскольку она все еще заблокирована. Является ли реализация продолжает уничтожать блокировку или игнорирует ошибку, не определена (я бы предположил, что она будет сохраняться, то есть она никогда не выйдет из dealloc).

  • Пример 2: если он заблокирован из другого потока (или того же потока, если он не реентерабелен), вы никогда не получите блокировку, и в результате может быть получена другая ошибка, тупик или исключение. Реализация также может (в конечном итоге) действовать без фиксации блокировки. Все, что гарантировано, регистрируется, когда/если обнаружена ошибка.

pthread_mutex es, и реализации, которые зависят от них, могут вести себя не очень изящно, если у вас такой дисбаланс блокировки; это всегда возвращается к ошибке программиста.

Правильная и защитная блокировка в чистых объектах и ​​c не очень хороша. Идиома Java верна и в равной степени применима к API-интерфейсам Foundation. Причина, по которой вы не видите этого, может быть связана с тем, что исключения являются менее популярным/используемым механизмом обработки ошибок в API Cocoa и программах, которые зависят от них (по сравнению с Java). см. также примечание Bavarious в комментариях

Ответ 2

Нет.

Исключения используются только для ошибок программирования в Cocoa. Они не используются для ситуаций, когда ожидается, что программа восстановится.