Использование @synchronized (self) {...} в функции класса

Случайно я использовал блок @synchronized с семафором self в методе класса.

+(void)someFunction {
    @synchronized(self) {
         /* some code */
    }
}

Кажется, это правильный код, по крайней мере, компилятор не дает мне никакой обратной связи. Мой вопрос: что здесь self? Насколько я могу сказать, блок @synchronized не работал, но он тоже не сбой.

Я просто спрашиваю из любопытства.

Ответ 1

self в этом случае относится к классу, а не к экземпляру. В ObjC классы сами являются объектами.

Ответ 2

self в этом контексте - это сам класс, прекрасно использовать @synchronized в функции класса, так как они также являются объектами Objective-C.

Ответ 3

Синтаксис @synchronized - это расширение компилятора для реализации mutex. Я предполагаю, что вы поняли что он делает. Компилятор переведет его во что-то другое, предположительно нечто похожее на критический раздел, потому что он менее интенсивен. Замки необходимо отслеживать. Реализация будет использовать объект для записи состояния блокировки, чтобы сохранить его целостность (т.е. Блокировка не должна быть получена дважды или разблокирована дважды).

В @synchronized(self) объект не должен быть self. Это может быть любой объект objective-c. Обратите внимание, что один блок @synchronized обычно ничего не делает (когда вы упомянули, что он не работает, он действительно ведет себя корректно). Но когда у вас есть два блока @synchronized на одном и том же объекте, одновременно будет выполняться только один блок, другому блоку придется ждать разблокировки блокировки (т.е. Первый блок отделки). Это помогает синхронизировать ситуацию, как в многопоточной среде.

Ответ 4

В методе класса self - это класс, вызываемый методом. Например, вы можете вызвать другие методы класса того же класса, используя self. [MyClass someFunction] и [self someFunction] будут эквивалентны рекурсивному вызову someFunction. Блок @synchronized Я уверен, работал, как и предполагалось.