Как @synchronized блокирует/разблокирует в Objective C?

Пожалуйста, не делайте этого.

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

Если вам нужно быстро прокомментировать / раскомментировать Java-код, вы можете использовать ярлык Ctrl+/. Он будет использовать однострочные комментарии (//) для закомментирования текущей строки или любого количества отмеченных строк кода.

198
задан David Lin 31 July 2009 в 12:16
поделиться

3 ответа

Синхронизация на уровне языка Objective-C использует мьютекс, как и NSLock . Семантически есть некоторые небольшие технические различия, но в основном правильно думать о них как о двух отдельных интерфейсах, реализованных поверх общего (более примитивного) объекта.

В частности, с NSLock у вас есть явная блокировка, тогда как с @synchronized у вас есть неявная блокировка, связанная с объектом, который вы используете для синхронизации. Преимущество блокировки уровня языка состоит в том, что компилятор понимает ее, поэтому он может решать проблемы с областью видимости, но механически они ведут себя в основном одинаково.

Вы можете думать о @synchronized как о переписанном компиляторе:

- (NSString *)myString {
  @synchronized(self) {
    return [[myString retain] autorelease];
  }
}

преобразуется в:

318
ответ дан 23 November 2019 в 05:12
поделиться

В Objective-C блок @synchronized автоматически обрабатывает блокировку и разблокировку (а также возможные исключения). Среда выполнения динамически генерирует NSRecursiveLock, связанный с объектом, с которым вы синхронизируете. Эта документация Apple объясняет это более подробно. Вот почему вы не видите сообщения журнала из вашего подкласса NSLock - объект, который вы синхронизируете, может быть чем угодно, а не только NSLock.

По сути, @synchronized (...) - это удобная конструкция, которая упрощает ваш код. Как и большинство упрощающих абстракций, это связано с накладными расходами (думайте об этом как о скрытых затратах), и хорошо знать об этом, но чистая производительность, вероятно, не является высшей целью при использовании таких конструкций в любом случае.

40
ответ дан 23 November 2019 в 05:12
поделиться

Он просто связывает семафор с каждым объектом и использует его.

-3
ответ дан 23 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: